递归方法生成N位的格雷码
来源:互联网 发布:电饭煲型号推荐 知乎 编辑:程序博客网 时间:2024/06/05 14:16
原理:
点击打开链接
网上看见的几种形式的函数:
动态字符数组形式:
char** GrayCode(int n)
{int temp = 1;
for (int i = 0; i<n; i++)
temp *= 2;//n位格雷码一共有2^n个码字
char **graycode = new char*[temp];//动态申请2^n *n大小的数组,存放格雷码
for (int i = 0; i<temp; i++)
{
graycode[i] = new char[n];//动态申请二维数组
}
if (n == 1)
{//递归终止条件
graycode[0][0] = '0';
graycode[1][0] = '1';
return graycode;
}
char **p = GrayCode(n - 1);//开始递归
for (int i = 0; i<temp / 2; i++)
{
graycode[i][0] = '0';
graycode[i + temp / 2][0] = '1';
for (int j = 1; j<n; j++)
{
graycode[i][j] = p[i][j - 1];
graycode[temp - i - 1][j] = p[i][j - 1];//注意是顺序,上下对称
}
}
return graycode;
}
string指针:
string* recursive_Graycode(int N){
int len = pow(2, N);
string* s = new string [len];
if (N == 1)
{
s[0] = "0";
s[1] = "1";
return s;
}
string* last = recursive_Graycode(N - 1);
for (int i = 0; i < pow(2,N-1); i++)
{
s[i] = "0" + last[i];
s[len - 1 - i] = "1" + last[i];
}
delete[] last; //删除上一个
return s;
}
感觉最简单的是用dfs形式的:
#include<iostream>
using namespace std;
int N;//
char* s;
char** out;
int cnt = 0;
void dfs(int i);
int main()
{
cin >> N;
s = new char[N+1];
for (int i = 0; i<N; i++)
s[i] = '0';
s[N] = '\0'; //尾部加上‘\0’,这样后面使用strcpy_s得到的outmo末尾就有结束符了。
out = new char*[pow(2, N)];
for (int i = 0; i < pow(2, N); ++i)
out[i] = new char[N];
dfs(0);
for (int i = 0; i < pow(2, N); ++i)
cout << out[i]<<endl;
return 0;
}
void dfs(int i)
{
if (i == N)
strcpy_s(out[cnt++],N+1, s);//到达底部就输出
//out[cnt++] = s; //不能直接赋
else
{
dfs(i + 1); //深度优先搜索
if (s[i] == '0') s[i] = '1';
else s[i] = '0'; //把当前位逆转
dfs(i + 1); //继续向下搜索
}
}
0 0
- 递归方法生成N位的格雷码
- 递归生成n位的格雷码
- Java 生成N位随机数的方法
- 递归与动态规划---N皇后问题的递归方法和位运算方法
- C#随机生成n位数字和字母的方法
- 生成和测试N位大素数的方法
- 生成n位不同的验证码
- 生成n位不同的验证码
- 生成n位不同的验证码
- 生成n位不同的验证码
- 随机生成一个n bit位的长整数(随机函数的使用,特定区间随机数的生成方法)
- Python:N的阶乘的递归方法
- 通过递归遍历n位2进制数的所有情况
- leetcode:N-Queens II 的位运算非递归解法
- 用递归方法求n的阶乘。
- 用递归的方法求n!.cpp
- m^n实现,利用递归的方法
- Python:N的阶乘非递归方法
- POJ 3253 (优先队列)
- JavaScript 学些笔记
- 常见排序算法小结
- iOS:手把手教你发布代码到CocoaPods(Trunk方式)
- substring和substr,slice和splice傻傻分不清楚?进来!
- 递归方法生成N位的格雷码
- 安卓studio修改项目名称
- leetcode——217——Contains Duplicate
- Find the smallest positive number missing from an unsorted array
- Android神奇跑马灯效果多种实现
- String
- 【BZOJ 3503】 [Cqoi2014]和谐矩阵|高斯消元|xor方程组
- poj3356(LCS)
- PHP数组排序详解