阿里网站年费怎么做分录键词优化排名
1、格雷码的介绍
格雷码 百度百科
2、找规律的方式,产生格雷码
代码来源:构造Gray码的分治算法
#include "iostream"
#include "cmath"
using namespace std;const int N=10;
int arr[N*N][N]; //arr[i][j]表示第i个格雷码的第j位//构造b位格雷码
//a为格雷码的个数
void gray(int a, int b)
{if(b==1) //如果格雷码宽度为1{arr[0][0] = 0;3arr[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(int 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;
}cd
图解上述程序:(回头补上)
2、产生格雷码的正确打开方式
递归生成码表
这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
- 1位格雷码有两个码字
- (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
- (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1 [4]
- n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1
代码来源:16级柏哥
参考代码:一个小编程题-递归方式生成N位格雷码
//参考 16级柏哥程序
//2019/6/24
#include<iostream>
#include<string>
#include<vector>using namespace std;vector<string> g;void Grid(int n)
{if(n<1)return;if(n==1){g.push_back("0");g.push_back("1");}else{Grid(n-1);int length=g.size();for(int i=0;i<length;i++)g.push_back("0"+g[i]);for(int i=length-1;i>=0;i--)g.push_back("1"+g[i]);g.erase(g.begin(),g.begin()+length);}
} int main(void)
{int n;while(cin>>n){g.clear();Grid(n);for(int i=0;i<g.size();i++)cout<<g[i]<<endl; cout<<"total grid:"<<g.size()<<endl;}
}
图解代码:(回头补上)
参考文章
格雷码 百度百科
构造Gray码的分治算法
一个小编程题-递归方式生成N位格雷码