按序生成n位的全部格雷码
generate n digits gray code in order
#include "iostream"
#include "cstring"
#include "cstdio"
#include "string.h"
#include "stack"
#include "cmath"
using namespace std;
int n;
char s[1050000][20];
//char s[100][20];
void gao(int m)
{
int temp=pow(2,m);
for(int i=1;i<=temp;i++)
{
strcpy(s[2*temp-i+1],s[i]);
}
for(int i=1;i<=2*temp;i++)
{
for(int j=m-1;j>=0;j--)
{
s[i][j+1]=s[i][j];
}
}
}
void dfs(int m)
{
if(m==1)
{
s[1][0]='0';
s[2][0]='1';
return;
}
dfs(m-1);
gao(m-1);
int temp=pow(2,m-1);
for(int i=1;i<=temp;i++)
{
s[i][0]='0';
}
for(int i=temp+1;i<=temp*2;i++)
{
s[i][0]='1';
}
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
//n digits
scanf("%d",&n);
dfs(n);
for(int i=1;i<=pow(2,n);i++)
{
for(int j=0;j<=n-1;j++)
{
printf("%c",s[i][j]);
}
printf("\n");
}
}
}