c ++ división lingüística y la estrategia de conquista para generar código Gray

código Gray es una cadena de 2 ^ n secuencias. Ninguna secuencia de elementos idénticos, cada uno de longitud n es (0,1) cuerdas, apenas adyacentes a un elemento diferente.

Aquí están algunos de código Golay baja

Un código de Gray (2 ^ 1 = 2) código Gray de 2 bits (2 ^ 2 = 4) código Gray de 3 bits (2 ^ 3 = 8) código Gray de 4 bits (2 ^ 4 = 16) Otros ...
0 00 000 0000 ...
1 01 001 0001
11 011 0011
10 010 0010
110 0110
111 0111
101 0101
100 0100
1100
1101
1111
1110
1010
1011
1001
1000

No es difícil de sacar de la tabla anterior:

  • Un código de Gray tiene dos palabras de código 0
  • (N + 1) antes de 2 ^ n bits palabras de código de código Gray es igual a palabras de código de n bits de un código Gray, en el orden escrito, prefijo 0
  • (N + 1) en el código Gray bit 2 ^ n palabras de código es igual a palabras de código de n bits de un código Gray, escritos en orden inverso, prefijo 1
  • n + 1 bits gris conjunto de códigos = n bits conjunto de códigos de Gray (orden) prefijo 0 + n bits conjunto de códigos de Gray (inversa) prefijo 1

Utilice matriz de dos dimensiones y de forma recursiva para resolver el problema:

  • n = 1, arr [0] [0] = 0, arr [1] [0] = 1
  • n> 1, el recursiva ilustra como sigue:
0 1 2 3 4 ... norte
0 0 0 0
1 1 0 0
2 1 1 0
3 0 1 0
4 0 1 1
5 1 1 1
6 1 0 1
7 0 0 1
...
norte

salida de código de color gris, la salida de derecha a izquierda

#include <iostream> 
#include<math.h> 
using namespace std; 
void Gray(int **arr,int sum, int n) {     //Gray生成函数
    if (n == 1) {
        arr[0][0] = 0;
        arr[1][0] = 1;
        return;
    }
    Gray(arr,sum / 2, n - 1);
    for (int i = 0; i < sum / 2; i++) {		//循环作用为添加 0 和 1 
        arr[i][n - 1] = 0;
        arr[sum - i - 1][n - 1] = 1;
    }	
    for (int i = sum / 2; i < sum; i++) {	//循环作用为 倒序复制
        for (int j = 0; j < n - 1; j++)
            arr[i][j] = arr[sum - i - 1][j];
    }
}
int main()
{
    int n;
    int** arr;
    cout << "输入n: ";
    cin >> n;
    int sum = pow(2, n);  
    arr = new int* [sum];       //动态二维数组
    for (int i = 0; i < sum; i++)
        arr[i] = new int[n];
    Gray(arr, sum, n);		//生成格雷码
    for (int i = 0; i < sum; i++) {	//输出,方向为右向左  ←
        for (int j = n-1; j>=0  ; j--)
        {
            cout << arr[i][j];
        }
        cout << endl;
    }
    for (int i = 0; i < sum; i++)	//释放内存
        delete[] arr[i];
    delete[] arr;
    return 0;
}

Ejecutar representaciones
Aquí Insertar imagen Descripción
Si encuentras este artículo útil para usted, por favor elija una alabanza que ~ ~ ° pwp

Publicó un artículo original · ganado elogios 2 · vistas 50

Supongo que te gusta

Origin blog.csdn.net/weixin_43853811/article/details/105080371
Recomendado
Clasificación