Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n 的字符串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)
对于给定的正整数n,格雷码为满足如下条件的一个编码序列。
(1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。
(2)序列中无相同的编码。
(3)序列中位置相邻的两个编码恰有一位不同。
下面为具体代码:
#include "iostream"
#include "cmath"
using namespace std;
int arr[1024][1024]; //arr[i][j]表示第i个格雷码的第j位
//构造b位格雷码
//a为格雷码的个数
void gray(int a, int b)
{
if(b==1) //如果格雷码宽度为1
{
arr[0][0] = 0;
arr[1][0] = 1;
return;
}
for(int i=0; i<a/2; i++) //格雷码最高位
{
arr[i][b-1] = 0; //生成的格雷码前一半最高位填“0”
arr[a-i-1][b-1] = 1; //后一半最高位位填“1”
}
gray(a/2, b-1); //生成b-1位格雷码,填写到目标码高半部分
for(i=a/2; i<a; i++) //格雷码低半部分
for(int j=0; j<b-1; j++)
arr[i][j] = arr[a-i-1][j];
}
int main()
{
int b;
cout << "输入格雷码位数:";
cin >> b;
int a = pow(2, b); //格雷码个数
gray(a, b);
cout << "格雷码为:\n";
for(int i=0; i<a; i++)
{
for(int j=0; j<b; j++)
cout << arr[i][j];
cout << endl;
}
return 0;
}
转自:https://blog.csdn.net/u012319493/article/details/49851799