用户名或者密码错误
| 注册账号 | 忘记密码
<->

格雷码怎么做!!!

chenjunde 2022-08-11 16:05:58

如题

共 10 条回复

mingming

格雷码(Gray Code)是一种特殊的 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻。

所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。

位二进制的格雷码不止一种,下面给出其中一种格雷码的生成算法:

1 位格雷码由两个 1 位二进制串组成,顺序为:0,1。 位格雷码的前 个二进制串,可以由依此算法生成的 位格雷码(总共 个 位二进制串)按顺序排列,再在每个串前加一个前缀 0 构成。 位格雷码的后 个二进制串,可以由依此算法生成的 位格雷码(总共 个 位二进制串)按逆序排列,再在每个串前加一个前缀 1 构成。 按照 2 和 3 的顺序把操作过程中生成的串排列。 按该算法,2 位格雷码可以这样推出:

已知 1 位格雷码为 0,1。 前两个格雷码在 1 操作的基础上加前缀 0,可得 00,01。后两个格雷码在 1 操作的基础上加前缀 1 并倒序,可得 11,10。 合并得到 00,01,11,10。

现在给出 ,请你求出按上述算法生成的所有 位格雷码。

输入格式 输入一个整数 ,意义见题目描述。

输出格式 按题意要求顺序,输出 个格雷码,每个占一行。

样例 样例输入1 1 样例输出1 0 1 样例输入2 2 样例输出2 00 01 11 10 样例输入3 3 样例输出3 000 001 011 010 110 111 101 100 数据范围与提示 数据范围:

样例 3 说明:

mingming

#include<bits/stdc++.h> using namespace std; string ans[(1<<20)+10]; int main(){ int n; cin>>n; ans[1]="0"; ans[2]="1"; for(int i=n,ij=1;i>1;i--,ij++){ int h=(1<<(ij)); for(int j=1,m=h*2;j<=h;j++,m--){ ans[m]="1"+ans[j]; ans[j]="0"+ans[j]; }

}	
for(int i=1;i<=(1<<n);i++){
	cout<<ans[i]<<endl;
}

}

linuoyi
Albin
jack1234

来,让我看看 来

jack1234

小黑子是不是有病·阿

chenjunde

。。。

jack1234

这出题人脑子发热到45°了

jack1234
chenjunde