格雷码:任意相邻的代码只有一位二进制位不同。
每个二进制数为n位,每个二进制数相比,都只有一位二进制码不相同;
比如n=1,{0,1};
n=2,{00,01,11,10};
n=3,{000,001,011,010,110,111,101,100}
思路:
以n=3的情况为例
000
001
011
010
110
111
101
100
在实现的时候,我们可以在上一层加上0或1,用递归来实现。
第一步:产生0和1两个字符串
第二步:在两个字符串前面分别加上0和1,得到00,01,11,10(注意对称)
第三步:在第二步的基础上给每个字符串加上0和1
由上面分析可知:
n位格雷码是基于n-1位格雷码生成的。
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<string> getGray(int n) {
if (n == 1)
{
vector<string> re;
re.push_back("0");
re.push_back("1");
return re;
}
vector<string> last = getGray(n - 1);
int curSize = last.size() * 2;
vector<string> current(curSize);
for (int i = 0; i < last.size(); i++)
{
current[i] = "0" + last[i];
current[curSize - 1 - i] = '1' + last[i];
}
return current;
}
int main()
{
vector<string> re = getGray(4);
for (int i = 0; i < re.size(); i++)
cout << re[i] << endl;
return 0;
}