二维格雷码
题目内容
给定 n,请你输出一个 2 ^n× 2^n的二维格雷码。
格雷码是一种二进制编码方法,相邻的两个数在二进制下只有一位不同。
本题中,即ai,j和ai,j+1,ai,j和ai+1,j在二进制表示下有且只有一位不同。同时我们要求从0到(22*n)-1中每个数只出现过恰好一次。
本题采用SPECLIAL JUDGE,输出符合条件的任一解即可。
输入格式
一个整数n(1<=n<=8)。
输出格式
输出一个2 ^n× 2^n的二维格雷码。
注意你应当输出的是十进制表示下的结果。
输入样例
这里给出一组输入。例如:
2
输出样例
这里给出一组相应的输出。例如:
0 1 3 2
4 5 7 6
12 13 15 14
8 9 11 10
题解
大家在做题时候一定不要存在侥幸心理,在考这道题的前一晚上我看到了这一知识点,但是我并没有去了解,以至于考试时候没有做出来,当时是十分的后悔!!!!
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int a[N];
int g(int n){
return n ^ (n >> 1);
}//这里是格雷码经典解法
int main(){
int n;
cin>>n;
int l=0;
for(int i=0;i<=pow(2,n)-1;i++){
a[l++]=g(i);
cout<<g(i)<<endl;
}
// for(int i=0;i<l;i++){
// cout<<a[i]<<" ";
// }
for(int i=0;i<pow(2,n);i++){
for(int j=0;j<pow(2,n);j++){
cout<<a[i]*pow(2,n)+a[j]<<" ";
}
cout<<endl;
}
// cout<<g(9)<<endl;
return 0;
//当时怎么就没想到呢,如果我们枚举出第一行的答案
//可以将第一行的答案开始左移n位,这样同时也就满足了
//上面与下面只差一位,这样就保证了一个数的右边与下边
}