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("\n");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 }