BZOJ1081. [SCOI2005]超级格雷码(dfs)

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;
}

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页