Description
著名的格雷码是指2n个不同n位二进制数(即0~2n-1,不足n位在前补零)的一个排列,这个排列满足相邻的两
个二进制数的n位数字中最多只有一个数字不同(例如003和001就有一个数位不同,而003和030有两个数位不同,
不符合条件)。例如n=2时,(00,01,11,10)就是一个满足条件的格雷码。 所谓超级格雷码就是指Bn个不同的n位B
进制数的排列满足上面的条件。 任务:给出n和B(2≤B≤36, 1≤Bn≤65535),求一个满足条件的格雷码。对于
大于9的数位用AZ表示(1035)。
Input
只有一行,为两个整数n和B。
Output
一共Bn个行,每行一个B进制数,表示你所求得的符合条件的排列
Sample Input
2 2
Sample Output
00
01
11
10
Hint
请不要提交此题…
Source
思路: 递归,走一轮,对称着再走一轮。
000
100
110
010
011
111
101
001
假设01为正排列,如这个排列,感觉规律就是,每两个数字的异或为1,后面的排列就是反的(10),否则就是正的(01)。
和gym的这道题一样
https://blog.csdn.net/tomjobs/article/details/101709131
#include <cstdio>
#include <cstring>
using namespace std;
int n,b,a[1005];
void dfs(int x,int p)
{
if(x == n + 1)
{
for(int i = n;i;i--)a[i] < 10 ? printf("%d",a[i]) : putchar(a[i] + 55);
printf("\n");
return;
}
if(p)
{
for(int i = b - 1;~i;i--)
{
a[x] = i;dfs(x + 1,(i & 1) ^ 1);
}
}
else
{
for(int i = 0;i <= b - 1;i++)
{
a[x] = i;
dfs(x + 1,(i & 1));
}
}
}
int main()
{
scanf("%d%d",&n,&b);
dfs(1,0);
return 0;
}