格雷码的具体定义自行百度,简单的说就是有0和1序列组成,而且相邻的码只有1位不相同;
输入:格雷码位数n
输出:n位格雷码的所有情况
思路:利用递归搞搞
代码:
#include <stdio.h>
#include <stdlib.h>
int n;
char s[17];
void dfs(int i)
{
if(i==n) printf("%s\n",s); //到达底部就输出
else
{
dfs(i+1); //深度优先搜索
if(s[i]=='0') s[i]='1';
else s[i]='0'; //把当前位逆转
dfs(i+1); //继续向下搜索
}
}
int main()
{
int i;
while(1)
{
scanf("%d",&n);
if(!n) break;
for(i=0;i<17;i++) s[i]='0';
s[n]='\0';
dfs(0);
printf("\n");
}
system("pause");
return 0;
}
利用一种办法:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
vector<string> get_gray(int n)
{
vector<string> res;
if(n==1){
res.push_back("0");
res.push_back("1");
return res;
}
vector<string> v = get_gray(n-1);
int len = pow(2,n-1);
for(int i=0;i<len;i++){
res.push_back("0"+v[i]);
}
for(int i=len-1;i>=0;i--){
res.push_back('1'+v[i]);
}
return res;
}
int main()
{
int n;
cin>>n;
vector<string> gy;
gy=get_gray(n);
for(int i=0;i<gy.size();i++){
cout<<gy[i]<<endl;
}
return 0;
}