bzoj1081: [SCOI2005]超级格雷码(dfs)

1081: [SCOI2005]超级格雷码

题目:传送门 


题解:

   又是一道水题...

   因为之前做过所以知道规律:

   如n=2 B=3:

   00 10 20    21 11 01    02 12 22

   不难看出,偶数结尾的从前面从小到大,奇数的话就是大到小

    


代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,B;
 8 int a[1100];
 9 void dfs(int k,int T)
10 {
11     if(k==n+1)
12     {
13         for(int i=n;i>=1;--i)
14         {
15             if(a[i]<10)printf("%d",a[i]);
16             else printf("%c",a[i]-10+'A');
17         }
18         printf("
");return ;
19     }
20     if(T==1)
21     {
22         for(int i=B-1;i>=0;--i)
23         {
24             a[k]=i;if(i%2==1)dfs(k+1,0);
25             else dfs(k+1,1);
26         }
27     }
28     else
29     {
30         for(int i=0;i<B;++i)
31         {
32             a[k]=i;if(i%2==1)dfs(k+1,1);
33             else dfs(k+1,0);
34         }
35     }
36 }
37 int main()
38 {
39     scanf("%d%d",&n,&B);
40     dfs(1,0);
41     return 0;
42 }
原文地址:https://www.cnblogs.com/CHerish_OI/p/8817712.html