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

C++에서 이진 행렬의 최대 십진수 값 경로

<시간/>

주어진 작업은 주어진 정사각형 이진 배열의 왼쪽 상단 요소에서 오른쪽 하단 요소까지의 경로, 즉 인덱스 [0][0]에서 시작하여 인덱스까지 이동하는 동안 얻을 수 있는 최대 정수 값을 찾는 것입니다. [n - 1][n - 1].

경로를 덮는 동안 오른쪽([i][j + 1]) 또는 아래쪽([i + 1][j])으로만 이동할 수 있습니다.

정수 값은 통과한 경로의 비트를 사용하여 계산됩니다.

이제 예제를 사용하여 무엇을 해야 하는지 이해합시다 -

입력

<미리>m ={ {1, 1, 1, 1}, {0, 0, 1, 0}, {1, 0, 1, 1}, {0, 1, 1, 1}}

출력

127

설명

우리가 선택한 경로는 [0, 0] →[0, 1] → [0, 2] → [1, 2] → [2, 2] → [3, 2] →[3, 3]

따라서 십진수 값은 =1*(2 0 ) + 1*(2 1 ) + 1*(2 2 ) + 1*(2 3 ) + 1*(2 4 ) + 1*(2 5 ) + 1*(2 6 )

=1 + 2 + 4 + 8 + 16 + 32 + 64

=127

입력

<미리>m ={ {1, 0, 1, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {0, 1, 1, 1}}

출력

109

아래 프로그램에서 사용하는 접근 방식은 다음과 같습니다.

  • 먼저 #define을 사용하여 맨 위에 있는 정사각형 행렬의 측면 크기를 정의합니다.

  • main() 함수에서 2D 배열 int m[][4]를 만들어 행렬을 저장하고 Max(m, 0, 0, 0)

    를 호출합니다.
  • max() 함수에서 먼저 (i>=side || j>=side ) 여부를 확인합니다. 그렇다면 행렬 경계를 벗어나 0을 반환한다는 의미입니다.

  • 새 변수 int ans를 만들고 ans =max(Max(m, i, j+1, pw+1), Max(m, i+1, j, pw+1))를 넣습니다.

  • 그런 다음 (m[i][j] ==1)인지 확인합니다. 그렇다면 pow(2, pw) + ans를 반환합니다.

  • 그렇지 않으면 단순히 as를 반환합니다.

예시

#include네임스페이스 std;#define side 4// pw는 2의 거듭제곱입니다 Max(int ​​m[][side], int i, int j, int pw){ // Out 경계의 if (i>=side || j>=side ) return 0; int ans =최대(최대(m, i, j+1, pw+1), 최대(m, i+1, j, pw+1)); if (m[i][j] ==1) pow(2, pw) + ans를 반환합니다. else return ans;}//main functionint main(){ int m[][4] ={{1, 1, 1, 1},{0, 0, 1, 0},{1, 0, 1, 1 },{0, 1, 1, 1}}; cout <<최대(m, 0, 0, 0); 반환 0;}

출력

127