Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1546167
  • 博文数量: 327
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 3556
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-05 21:28
个人简介

东黑布衣,流浪幽燕。 真诚善良,值得信赖。

文章分类

全部博文(327)

我的朋友

分类: BSD

2017-05-17 15:42:52


  1. // 20170517adv.cpp:排列组合
  2. #include "stdafx.h"
  3. #include <stdio.h>
  4. int N;//[3,7]
  5. int M;//[3,6]
  6. int a[7];
  7. int b[6];
  8. int mark[7];
  9. int tbl[5040][6];
  10. int idx;
  11. int count;

  12. void initialize(void)
  13. {
  14.    int i,j;
  15.    for(j=0;j<N;j++)
  16.    {
  17.       a[j]=-1;
  18.       mark[j]=0;
  19.    }
  20.    for(j=0;j<M;j++)
  21.       b[j]=-1;
  22.    for(i=0;i<5040;i++)
  23.       for(j=0;j<6;j++)
  24.          tbl[i][j]=-1;

  25.    scanf("%d %d",&N,&M);
  26.    for(j=0;j<N;j++)
  27.       scanf("%d",&a[j]);
  28.    idx=0;
  29.    count=0;
  30. }

  31. int search_table(void)
  32. {
  33.    int i,j;
  34.    for(i=0;i<idx;i++)
  35.    {
  36.       for(j=0;j<M;j++)
  37.       {
  38.          if(b[j]!=tbl[i][j])
  39.             break;
  40.          if(j==M-1)
  41.             return 1;
  42.       }
  43.    }
  44.    return 0;
  45. }

  46. void bracelet_combination(int step)
  47. {
  48.    int i,j;
  49.    int found;
  50.    if(step==M)
  51.    {
  52.       found=0;
  53.       found=search_table();
  54.       if(found!=1)
  55.       {
  56.          for(i=0;i<M;i++)
  57.          {
  58.             for(j=0;j<M;j++)
  59.             {
  60.                tbl[idx][j]=b[(i+j)%M];
  61.             }
  62.             idx++;
  63.          }
  64.          count++;
  65.       }
  66.       return;
  67.    }
  68.    for(i=0;i<N;i++)
  69.    {
  70.       if(mark[i]==0)
  71.       {
  72.          b[step]=a[i];
  73.          mark[i]=1;
  74.          bracelet_combination(step+1);
  75.          mark[i]=0;
  76.       }
  77.    }
  78.    return;
  79. }


  80. int _tmain(int argc, _TCHAR* argv[])
  81. {
  82.    int t,test_case;
  83.    freopen("20170517in.txt","r",stdin);
  84.    scanf("%d", &test_case);
  85.    for(t=1;t<=test_case;t++)
  86.    {
  87.       initialize();
  88.       bracelet_combination(0);
  89.       printf("#%d %d\n",t,count);
  90.    }
  91.    return 0;
  92. }



/* input
5
3 3
1 2 3
4 4
1 2 2 3
5 5
5 6 5 7 8
6 4
3 3 3 4 4 4
7 6
2 3 1 5 4 6 8
*/

/* output
2
3
12
4
840
*/
阅读(1414) | 评论(0) | 转发(0) |
0

上一篇:ACM02_0408 Hero

下一篇:[20170524 ADV] Hourglasses

给主人留下些什么吧!~~