主题:如何构造格雷码?
flks
[专家分:0] 发布于 2005-04-05 11:46:00
各位编程高手:
请帮忙!构造格雷码!
“格雷码”(gray code)是一个长度为2的n 次方的序列,满足:
(a),每个元素都是长度为n比特的串,
(b),序列中无相同元素
(c)。连续的两个元素恰好只有1比特的不同。例如:n=2时,格雷码为{00,01,11,10}
要求:
(1)。构造n=3时的格雷码。
(2)。利用分治策略设计一个算法对任意的n构造相应的“格雷码”。(语言不限)
小飞
回复列表 (共15个回复)
11 楼
ccpp [专家分:9360] 发布于 2006-04-03 16:46:00
有点勉强,但终于用递归实现了
#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 楼
ptchenmin1987 [专家分:0] 发布于 2007-03-23 19:27:00
能不能问一下 其中i,s表示什么
13 楼
polaris606 [专家分:460] 发布于 2007-04-04 17:34:00
很简单,分治加深搜~
14 楼
shi2005shuai [专家分:0] 发布于 2008-03-25 23:10:00
这里有一个分治递归的,代码虽然简单,但思想不简单,逻辑严密。
你可以参考一下
#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 楼
ccpp [专家分:9360] 发布于 2008-08-22 15:19:00
/*
正序输出格雷码算法
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;
}
我来回复