回 帖 发 新 帖 刷新版面

主题:如何构造格雷码?

各位编程高手:


    请帮忙!构造格雷码!
    “格雷码”(gray code)是一个长度为2的n 次方的序列,满足:
(a),每个元素都是长度为n比特的串,
(b),序列中无相同元素
(c)。连续的两个元素恰好只有1比特的不同。例如:n=2时,格雷码为{00,01,11,10}
要求:
(1)。构造n=3时的格雷码。
(2)。利用分治策略设计一个算法对任意的n构造相应的“格雷码”。(语言不限)

                                                             小飞

回复列表 (共15个回复)

11 楼

有点勉强,但终于用递归实现了
#include<stdio.h>
#include<stdlib.h>
void Print(char *str,int i,int k,int s)
{
    if(k == 0)
    {
     printf("%s\n",str);
    }
    else if(s == 0) /*正向*/
    {
        str[i] = '0';
        Print(str,i+1,k-1,0);
        str[i] = '1';
        Print(str,i+1,k-1,1);
    }
    else if(s == 1) /*反向*/
    {
        str[i] = '1';
        Print(str,i+1,k-1,0);
        str[i] = '0';
        Print(str,i+1,k-1,1);
    }
}

void GBC(int n)
{
    char *str = (char*)malloc(n+1);
    str[n] = '\0';
    Print(str,0,n,0);
    free(str);
}
int main(void)
{
   GBC(3);
  return 0;
}

12 楼


能不能问一下 其中i,s表示什么

13 楼

很简单,分治加深搜~

14 楼


这里有一个分治递归的,代码虽然简单,但思想不简单,逻辑严密。 
你可以参考一下 

#include <iostream> 

using namespace std; 

void print(int a[], int length); 
void gray(int n, int a[], int length); 

int main(void) 

int n; 
cout<<"Please input n:\t"; 
cin>>n; 

int* a = new int[n]; 
for (int i = 0; i < n; i ++) 

a[i] = 0; 

//输出全0的情况 
print(a, n); 
//递归计算其余序列 
gray(n - 1, a, n); 
system("pause");
return 0; 


void print(int a[], int length) 

for(int i = length - 1; i >= 0; i--) 

cout<<a[i]; 

cout<<endl; 


void gray(int n, int a[], int length) 

if(n == 0) 

a[n] = 1 - a[n]; 
print(a, length); 

else 

gray(n - 1, a, length); 
a[n] = 1 - a[n]; 
print(a, length); 
gray(n - 1, a, length); 

}

15 楼

/*
正序输出格雷码算法 
1)正序输出n-1位的格雷码
2)反序输出n-1位的格雷码
3)在第1步得到的格雷码前面加0,在第2步得到的格雷码前面加1
-----
反序输出格雷码算法 
1)正序输出n-1位的格雷码
2)反序输出n-1位的格雷码
3)在第1步得到的格雷码前面加1,在第2步得到的格雷码前面加0

用交互递归实现格雷码的输出! 
*/
#include <stdio.h>
#include<stdlib.h>
char *ps;//全局变量
//两个递归函数,交互调用 
void ZX(int n,char* str);//正序输出格雷码 
void FX(int n,char* str)//反序输出格雷码 
{  
    if(n == 0)
    {    
        printf("%s\n",ps);
        return;
    }
    *str = '1';
      ZX(n-1,str+1);
      *str = '0';
      FX(n-1,str+1);
}
void ZX(int n,char* str)
{  
    if(n == 0)
    {    
        printf("%s\n",ps);
        return;
    }
    *str = '0';
      ZX(n-1,str+1);
      *str = '1';
      FX(n-1,str+1);
}
void GBC(int n)
{
    //申请缓冲区 
    char *str = (char*)malloc(n+1);
    ps = str;//保存缓冲区首指针  
    str[n] = '\0';
    ZX(n,str);
    free(str);
}
int main(void)
{
    int n = 1;
    while(n != 0)
    {
        scanf("%d", &n);
        GBC(n);
        printf("\n");
    }
    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册