结构光三维重建学习笔记
所以,格雷码的生成步骤: 产生0,1两个字符串;0、1 在第一步基础上: 每个字符串前都+0->0+0、0+1 翻转首个元素,其余对称:1+1、1+0 最终:00、01、11、10 在上一步基础上: 每个字符串前都+0->0+00、0+01、0+11、0+10 翻转首字符,其余对称:1+10、1+11、1+01、1+00 最终:000、001、011、010、110、111、101、100 之后递归即可!我们用C++代码来实现一下,采用递归的形式:
#include <iostream>
#include <vector>
#include <cassert>
using namespace std;
vector<string> GrayCode(int n) {
if (n < 1) {
cout << "格雷码数量必须大于0" << endl;
assert(0);
} else if (n == 1) {
vector<string> code;
code.emplace_back("0");
code.emplace_back("1");
return code;
} else {
vector<string> code;
vector<string> code_pre = GrayCode(n - 1);
for (int idx = 0; idx < code_pre.size(); ++idx) {
code.push_back("0" + code_pre[idx]);
}
for (int idx = int(code_pre.size() - 1); idx >= 0; --idx) {
code.push_back("1" + code_pre[idx]);
}
return code;
}
}
int main()
{
int n = 4;
vector<string> gray_code = GrayCode(n);
for (auto &g : gray_code){
cout << g << endl;
}
}
二进制转格雷码编码
<int> GrayCode2(int n){
int count = 1 << n;
vector<int> res(count,0);
for(int i = 1 ; i < count; i ++)
{
int bin = i,cur = bin >>