题目

alt

输入

alt

输出

alt

思路

要使相邻两项的异或值相加最小,就要相邻的数二进制尽可能相近,同时也要满足排列的性质。

0000

0001

0010

0011

在满足排列性质的前提下,发现只有两个数二进制异或完只剩下一个1的排序最小。

也就是答案构成格雷码。

格雷码第i项就是i^(i>>1)。

完整代码

```#include<bits/stdc++.h>

using namespace std;
int main(){
    int n;
    cin>>n;
    for(int i=0;i< 1<<n;i++){
        cout<<(i ^ (i>>1))<<" ";
    }
   
}