Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 최대 비트 차이가 있는 이진 행렬에서 행 쌍 찾기

<시간/>

이진 행렬이 있다고 가정합니다. 주어진 행렬에서 최대 비트 차이를 갖는 행 쌍을 찾아야 합니다.

따라서 입력이 행렬과 같으면 2행과 3행의 비트 차이가 4이므로 출력은 [2,3]이 되며 이것이 최대입니다.

  • 이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 값과 두 개의 자식이 있는 Trie 구조를 정의합니다.

  • get_max_bit_diff() 함수를 정의합니다. 이것은 trie, matrix, n, row_index,

    의 루트를 취합니다.
  • 임시 :=루트, 개수 :=0

  • for initialize i :=0, i

    • temp의 child[ matrix[row_index, i] ]가 NULL이 아니면 -

      • temp :=temp의 자식[ matrix[row_index, i] ]

    • 그렇지 않으면 temp의 child[1 - matrix[row_index, i]]가 NULL이 아닌 경우 -

      • temp :=temp의 자식[1- matrix[row_index, i]]

      • (1씩 증가)

  • leaf_index :=온도의 잎

  • temp_count :=0, temp :=루트

  • for initialize i :=0, i

    • temp의 child[ 1 - matrix[row_index, i] ]가 NULL이 아니면 -

      • temp :=child[ 1- matrix[row_index, i] ] of temp

      • (temp_count를 1씩 증가)

    • 그렇지 않으면 temp의 child[ matrix[row_index, i] ]가 NULL이 아닌 경우 -

      • temp :=temp의 자식[ matrix[row_index, i] ]

  • P =temp_count> count이면 (temp_count, leaf of temp)를 사용하여 쌍을 만들고 그렇지 않으면 (count, leaf_index)를 사용하여 쌍을 만듭니다.

  • 반환 P

  • 기본 방법에서 다음을 수행하십시오 -

  • 루트 =새 TrieNode

  • 루트에 0번째 행 삽입

  • max_bit_diff :=-inf

  • 한 쌍의 홍보 및 다른 쌍의 온도 정의

  • for initialize i :=1, i

    • temp :=get_max_bit_diff(루트, 매트, m, i)

    • max_bit_diff <임시의 첫 번째 경우 -

      • max_bit_diff :=temp.first

      • pr :=(temp.second, i + 1)을 사용하여 쌍을 만듭니다.

    • i번째 행을 루트에 삽입

  • 디스플레이 쌍 홍보

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include네임스페이스 사용 std;const int MAX =100;class TrieNode { public:int leaf; 트리노드 *자식[2]; TrieNode(){ 잎 =0; 자식[0] =자식[1] =NULL; }}; 무효 삽입(TrieNode *루트, int 행렬[][MAX], int n, int row_index){ TrieNode * 임시 =루트; for (int i=0; ichild[ matrix[row_index][i] ] ==NULL) temp->child[ matrix[row_index][i] ] =new TrieNode( ); 임시 =임시->자식[행렬 인덱스][i]]; } 임시 -> 잎 =row_index +1; } pairget_max_bit_diff(TrieNode * root, int matrix[][MAX], int n, int row_index) { TrieNode * temp =root; 정수 개수 =0; for (int i=0; i child[ matrix[row_index][i] ] !=NULL) temp =temp->child[ matrix[row_index][i] ]; else if (temp->child[1 - matrix[row_index][i]] !=NULL) { temp =temp->child[1- matrix[row_index][i]]; 카운트++; } } int leaf_index =임시->잎; 정수 temp_count =0; 임시 =루트; for (int i=0; i child[ 1 - matrix[row_index][i] ] !=NULL) { temp =temp->child[ 1- matrix[row_index][ 나] ]; temp_count++; } else if (temp->child[ matrix[row_index][i] ] !=NULL) temp =temp->child[ matrix[row_index][i] ]; } 쌍  P =temp_count> 개수 ? make_pair(temp_count, temp->leaf):make_pair(count, leaf_index); return P;}void get_max_diff( int mat[][MAX], int n, int m) { TrieNode * root =new TrieNode(); 삽입(루트, 매트, m, 0); 정수 max_bit_diff =INT_MIN; 쌍 pr, temp; for (int i =1; i  

입력

{{1,1,1,1},{1, 0, 1,1},{0,1,0,0},{1,0,0,0}}, 4,4 

출력

(2,3)