/*格雷码是一个长度为2^n的序列,序列中无相同元素,且每个元素都是长度为n的二进制位串,相邻元素恰好只有1位不同。例如长度为2^3的格雷码为(000,001,011,010,110,111,101,100)。设计分治算法对任意的n值构造相应的格雷码。*/
#include "stdio.h"
#include "string.h"
#define max 50
char M[max][max];
void gray(int k)
{
int i,j,t,temp,n=2;
for(i=1;i<k;i++)
{
temp=n;n=2*n;
for(j=0;j<temp;j++)
{
t=temp+j;
strcat(M[2*t],M[t]);strcat(M[2*t+1],M[t]);
if(t%2==0)
{
strcat(M[2*t],M[2]);strcat(M[2*t+1],M[3]);
}
else
{
strcat(M[2*t],M[3]);strcat(M[2*t+1],M[2]);
}
}
}
for(i=n;i<2*n;i++)
{
puts(M[i]);printf("/n");
}
}
main()
{
int x;
printf("/nEnter the M[2],M[3] and n:/n");
gets(M[2]);gets(M[3]);
scanf("%d",&x);
gray(x);
}
#include "stdio.h"
#include "string.h"
#define max 50
char M[max][max];
void gray(int k)
{
int i,j,t,temp,n=2;
for(i=1;i<k;i++)
{
temp=n;n=2*n;
for(j=0;j<temp;j++)
{
t=temp+j;
strcat(M[2*t],M[t]);strcat(M[2*t+1],M[t]);
if(t%2==0)
{
strcat(M[2*t],M[2]);strcat(M[2*t+1],M[3]);
}
else
{
strcat(M[2*t],M[3]);strcat(M[2*t+1],M[2]);
}
}
}
for(i=n;i<2*n;i++)
{
puts(M[i]);printf("/n");
}
}
main()
{
int x;
printf("/nEnter the M[2],M[3] and n:/n");
gets(M[2]);gets(M[3]);
scanf("%d",&x);
gray(x);
}