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

C++ 그리드에서 짝수 셀의 수를 최대화하는 연산의 수를 찾는 프로그램

<시간/>

h * w 차원의 그리드가 주어졌다고 가정합니다. 그리드의 모든 셀에는 특정 값이 할당되어 있습니다. 짝수 값을 갖는 셀을 최대화해야 합니다. 이를 위해 이전에 선택되지 않은 셀을 선택한 다음 현재 셀의 값을 1 감소하고 현재 셀에 수직 또는 수평으로 인접한 다른 셀의 값을 1 증가시킬 수 있습니다. 연산 횟수와 증가 및 감소 연산의 셀 번호를 출력합니다. 출력은 다음 형식입니다 -

  • 작업 수

  • 첫 번째 (셀 위치 감소) - (셀 위치 증가)

    ....

  • n번째 (셀 위치 감소) - (셀 위치 증가)

따라서 입력이 h =3, w =3, grid ={{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}인 경우 출력은

4(0, 1) - (0, 2)(2, 0) - (2, 1)(2, 1) - (2, 2)(0, 2) - (1, 2) 

단계

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

초기화 i :=0에 대한 튜플을 포함하는 새 배열 결과 정의, i 
 0이면:결과 grid[i, j] 끝에 tuple(i, j - 1, i, j) 삽입 :=grid[i, j] + tp grid[i, j] mod 2가 1과 같고 j 
 0이면:resultgrid 끝에 tuple(i - 1, w - 1, i, w - 1)을 삽입합니다. [i, w - 1] :=grid[i, w - 1] + tpif grid[i, w - 1] mod 2는 1과 같으며 then:grid[i, w - 1] :=grid[i, w - 1] - 1tp :=1Otherwisetp :=0print(결과 크기)초기화 i :=0, i <결과 크기일 때 업데이트(i를 1만큼 증가), do:print('(' + 첫 번째 값) result[i] + ',' + result[i]의 두 번째 값 + '- (' + result[i]의 세 번째 값 + ',' + result[i]의 네 번째 값)

예시

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

#include 네임스페이스 std;void solve(int h, int w, vector>grid){ vector> result; for(int i =0; i 
 0){ result.push_back(make_tuple(i, j-1, i, j)); 그리드[i][j] +=tp; } if(그리드[i][j]%2 ==1 &&j 
 0){ result.push_back(make_tuple(i-1, w-1, i, w-1)); 그리드[i][w-1] +=tp; } if(그리드[i][w-1]%2 ==1){ 그리드[i][w-1] -=1; tp =1; } 그렇지 않으면 tp =0; } cout <<(int)result.size() <(결과[i]) <<", " < (결과[i]) <<")" <<" - (" <(결과[i]) <<", " <(결과[i]) <<") "; cout <<'\n'; }}int main() { int h =3, w =3; 벡터<벡터> 그리드 ={{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}; 해결(h, w, 그리드); 반환 0;}

입력

3, 3, {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}

출력

4(0, 1) - (0, 2)(2, 0) - (2, 1)(2, 1) - (2, 2)(0, 2) - (1, 2)