问题描述
Gray码是一个长度为2n的序列。序列中无相同的元素,每个元素都是长度为n位的串,相邻元素恰好只有一位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。
编程任务
利用分治策略试设计一个算法对任意的n构造相应的Gray码。
数据输入
由文件input.txt提供输入数据n。
实现提示
把原问题分解为两个子问题,分别对两个子问题的每个数组后一位加0和1
解决思路:
①根据输出结果发现一定用二维数组进行输出
②这种题肯定是有规律可找的 百度发现格雷码规律
百度格雷码特征
#include
#include
#include
int Out[5000][5000]={0};
void Output(int n,int num)
//n=几位 num=pow(2,n)
{
if(n==1) //num=2
{
Out[0][0]=0;
Out[1][0]=1;
return;
}
int i=0,j=0;
for(i=0;i<num/2;i++)
{
Out[i][n-1]=0;
Out[num-i-1][n-1]=1;
}//根据规则 这一次各个位置 末位填0或1
Output(n-1,num/2);
for(i=num/2;i<num;i++)
for(j=0;j<n-1;j++)
Out[i][j]=Out[num-i-1][j];
}
int main()
{
FILE *In,*Ou;
int n;
if((In=fopen("D:\\input.txt","r"))!=NULL)
{
fscanf(In,"%d",&n);
fclose(In);
int i=1;
Output(n,pow(2,n));//调用输出函数
}
else
{
printf("输入文件打开失败!\n");
}
if((Ou=fopen("D:\\output.txt","w"))!=NULL)
{
int i=0,j=0;
for(i=0;i<pow(2,n);i++)
{
for(j=0;j<n;j++)
fprintf(Ou,"%d",Out[i][j]);
fprintf(Ou,"\n");
}
fclose(Ou);
}
else
{
printf("输出文件打开失败\n");
}
return 0;
}