//格雷码
#include<iostream>
#include<cstring>
#include<deque>
using namespace std;
void GrayCode_recur2(int a[],int n){
if(n==1){
a[1]=0;
a[2]=1;
return;
}
GrayCode_recur2(a,n-1);
for(int k=1<<(n-1),i=k; i>0; i--)
a[2*k-i+1] = a[i]+k;
cout<<endl;
}
void out(int a[],int n){
char str[32];
int m=1<<n;
for(int i=1;i<=m;i++)
{
itoa(a[i],str,2);//把a[i]转换成2进制的字符串在传给str;
int s = strlen(str);
for(int j=0;j<n-s;++j)
cout<<"0";
cout<<str<<" ";
}
cout<<endl;
}
void clear(int a[]){
for(int i=0;i<1024;i++)
a[i]=0;
}
void GrayCode_recur1(deque<string>& q,int n){
if(n==1){
q.push_back("0");
q.push_back("1");
return;
}
GrayCode_recur1(q,n-1);
auto iter=q.begin();
int k=1<<n;
for(int i=0;i<k/2;i++){//前半部分,补前缀0
*(iter)="0"+*(iter);
iter++;
}
for(int i=0;i<k/2;i++){//后半部分,补前缀1
iter--;
string tmp=*(iter);
tmp="1"+tmp.substr(1);
q.push_back(tmp);
}
}
void myout(deque<string>& q){
for(auto i=q.begin();i!=q.end();i++){
cout<<(*i)<<" ";
}
cout<<endl;
}
int main(){
int a[1024];
GrayCode_recur2(a,1);
out(a,1);
clear(a);
GrayCode_recur2(a,2);
out(a,2);
clear(a);
GrayCode_recur2(a,3);
out(a,3);
clear(a);
deque<string> q;
GrayCode_recur1(q,3);
myout(q);
return 0;
}
002-2算法笔记【分治】-习题2-14-格雷码
于 2022-04-24 09:22:36 首次发布