典型的二進制格雷碼(Binary Gray Code)簡稱格雷碼,在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同,則稱這種編碼爲格雷碼(Gray Code),另外由於最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱循環碼或反射碼。
自動生成格雷碼的算法主要利用以下規則:
1. 1位格雷碼有兩個碼字。
2. (n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加前綴0。
3. (n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加前綴1。
4. (n+1)位格雷碼的集合 = n位格雷碼集合(順序)加前綴0 + n位格雷碼集合(逆序)加前綴1。
簡而言之,就是後面的格雷碼等於其相鄰的前面的格雷碼按順序書寫,加前綴0,再按逆序書寫,加前綴1。如下圖所示:
按照這個思路很容易的實現代碼:
void generaterGrayCode(int n)
{
vector<string> grayCodeVec;
//當n爲1的時候的格雷碼
string aa = "0";
string bb = "1";
grayCodeVec.push_back(aa);
grayCodeVec.push_back(bb);
//產生大於兩位的格雷碼,n位格雷碼的數量爲2^n個
if (n > 1)
{
for (int i = 2; i <= n; i++)
{
//設置一個臨時存儲空間來存儲n-1位格雷碼
vector<string> tempGrayCodeVec;
for (size_t k = 0; k < grayCodeVec.size(); k++)
{
tempGrayCodeVec.push_back(grayCodeVec[k]);
}
//在前面產生的n-1位格雷碼前面添加一位數0產生2^(n-1)個n位格雷碼,並替換掉原來的n-1位格雷碼
int tempGrayCodeVecSize = tempGrayCodeVec.size();
for (int j = 0; j < tempGrayCodeVecSize; j++)
{
string tempbitzero = "0";
tempbitzero += tempGrayCodeVec[j];
grayCodeVec[j] = tempbitzero;
}
//將前面產生的n-1位格雷碼的順序反轉
//在反轉後的n-1位格雷碼前面添加一位數1產生剩下2^(n-1)個n位格雷碼,並存儲起來
for (int jj = tempGrayCodeVecSize-1; jj >= 0; jj--)
{
string tempbitone = "1";
tempbitone += tempGrayCodeVec[jj];
grayCodeVec.push_back(tempbitone);
}
//釋放掉臨時存儲空間
tempGrayCodeVec.clear();
}
}
//輸出n位格雷碼
for (size_t i = 0; i < grayCodeVec.size(); i++)
{
cout << grayCodeVec[i] << endl;
}
cout << endl;
}
完整代碼下載鏈接http://download.csdn.net/detail/qq_22980439/9482303