Gray码问题---分治法实验2

问题描述
Gray码是一个长度为2n的序列。序列中无相同的元素,每个元素都是长度为n位的串,相邻元素恰好只有一位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。
编程任务
利用分治策略试设计一个算法对任意的n构造相应的Gray码。
数据输入
由文件input.txt提供输入数据n。
实现提示
把原问题分解为两个子问题,分别对两个子问题的每个数组后一位加0和1
Gray码问题---分治法实验2_第1张图片

解决思路:
①根据输出结果发现一定用二维数组进行输出
②这种题肯定是有规律可找的 百度发现格雷码规律
百度格雷码特征
Gray码问题---分治法实验2_第2张图片Gray码问题---分治法实验2_第3张图片

#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;
}

你可能感兴趣的:(算法设计与分析,算法)