2017.11.24 算法分析与设计------Gay格雷码

1. 格雷码问题:

对于给定的正整数n,格雷码为满足如下条件的一个编码序列:
(1) 序列由2n个编码组成,每个编码都是长度为n的二进制位串。
(2) 序列中无相同的编码。
(3) 序列中位置相邻的两个编码恰有一位不同。
例如:n=1时的格雷码为:{0, 1}。
n=2时的格雷码为:{00, 01, 11, 10}。
n=3时的格雷码为:{000, 001, 011, 010,110,111,101,100}。
gray码问题求解思想:
将一个规模n位gray码序列表示为G(n), G(n)以相反顺序排列的序列表示为G’(n)。则gray码的构造规则即子问题的划分规则为:G(n+1)= 0G(n) 1G’(n) 。
gray码问题代码:G(n+1)= G(n) 0G’(n)1

#include <stdio.h>
#define N 1000
int num[N];
void gray(int n)
{
    int k,i;
    if(n==1)
    {num[0]=0;num[1]=1;return;}
    gray(n-1);
    k=1<<(n-1);
    for(i=0;i<k;++i)
        num[i+k]=num[k-1-i]+k;
}
void out(int n)
{
    int k,i,j,m;
    int count=0;
    k=1<<n;
    for(i=0;i<k;++i)
    {
        count++;
        //printf("%d ",count);
        if(count>8)
        {
            //printf("%d",count);
            printf("\n");
            count=1;
        }
        for(j=n;j>0;--j)
        {
            m=1<<(j-1);
            //printf("%d %d\n",m,num[k]);
            if(num[i]>=m)
            {
                printf("1");
                num[i]-=m;
            }
            else printf("0");
        }
        printf(" ");
    }
}
void out2(int n)
{
    int k,i;
    k=1<<n;
    for(i=0;i<k;++i)
        printf("%d ",num[i]);
    printf("\n");
}
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        gray(n);
        out(n);
        printf("\n");
    }
    return 0;
}
posted @ 2017-11-24 22:16  LegendQi  阅读(385)  评论(0编辑  收藏  举报