BZOJ1081: [SCOI2005]超级格雷码
【传送门:BZOJ3144】
简要题意:
2n个不同n位二进制数(即0~2n-1,不足n位在前补零)的一个排列,这个排列满足相邻的两个二进制数的n位数字中最多只有一个数字不同,所谓超级格雷码就是指Bn个不同的n位B 进制数的排列满足上面的条件
任务:给出n和B,求一个满足条件的格雷码
对于大于9的数位用A~Z表示(10~35)
题解:
DFS
当第i数是偶数时,第i-1个数是由大到小排列,当第i数是奇数时,第i-1个数是由小到大排列
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n,b; int a[110000]; void dfs(int k,int t) { if(k==n+1) { for(int i=n;i>=1;i--) { if(a[i]>=10) printf("%c",a[i]-10+'A'); else printf("%d",a[i]); } printf("\n"); return ; } if(t==1) { for(int i=b-1;i>=0;i--) { a[k]=i; dfs(k+1,1-i%2); } } else { for(int i=0;i<=b-1;i++) { a[k]=i; dfs(k+1,i%2); } } } int main() { scanf("%d%d",&n,&b); dfs(1,0); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚