二维格雷码

二维格雷码

题目内容

给定 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位,这样同时也就满足了
    //上面与下面只差一位,这样就保证了一个数的右边与下边
    
}
posted @ 2023-05-30 22:07  du463  阅读(65)  评论(0编辑  收藏  举报  来源