C ++ 언어 분할 및 정복 전략은 그레이 코드를 생성합니다

그레이 코드는 2 ^ N 시퀀스들의 문자열이다. 어떤 시퀀스 동일한 엘리먼트, 길이 n의 각각은 다른 소자에 인접하는 막 (0,1) 문자열 없다.

여기에 몇 가지 낮은 골 레이 코드입니다

회색 코드 (2 ^ 1 = 2) 2 비트 그레이 코드 (2 ^ 2 = 4) 3 비트의 그레이 코드 (2 ^ 3 = 8) 4 비트 그레이 코드 (2 ^ 4 = 16) 기타 ...
0 00 000 0000 ...
1 01 001 0001
(11) 011 0,011
(10) 010 0,010
(110) 0,110
111 0,111
(101) 0,101
(100) 0100
1,100
1,101
1,111
1,110
1,010
1,011
1,001
1,000

위의 표에서 그리 어렵지 않다 :

  • 회색의 코드는 두 개의 코드 워드를 가지고 0
  • (N + 1) 2 ^ N 비트 그레이 코드 워드 이전 프리픽스 0 기재된 순서로 그레이 코드의 n 비트 코드 워드 같다
  • 그레이 코드 (N + 1) 2 ^ N 개의 코드 워드 비트 역순 작성된 그레이 코드의 n 비트 코드 워드에 동일한, 접두어 1
  • N + 1 비트의 그레이 코드 세트 = N- 비트 그레이 코드 세트 (순서) (후진) 그레이 코드 세트를 N- 비트 + 0 접두사 1 접두사

사용하여 2 차원 배열을 하고 반복적으로 문제를 해결하기 위해 :

  • N = 1, 언 [0] [0] = 0, 도착 [1] [0] = 1
  • N> 1, 순환은 다음 그림 된 :
0 1 4 ...
0 0 0 0
1 1 0 0
1 1 0
0 1 0
4 0 1 1
5 1 1 1
6 1 0 1
(7) 0 0 1
...

그레이 코드 출력, 오른쪽에서 왼쪽으로 출력

#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;
}

렌더링을 실행
그림 삽입 설명 여기
당신이 당신에게 유용이 문서를 발견하면, 칭찬을 선택하십시오 그것을 ~ PWP ~ °

게시 된 원본 기사 · 원의 칭찬이 · 전망 (50)

추천

출처blog.csdn.net/weixin_43853811/article/details/105080371