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

세포 색칠 게임의 승자를 찾는 C++ 프로그램

<시간/>

두 개의 배열 A와 B가 각각 N개의 요소를 가지고 있다고 가정합니다. Amal과 Bimal이 1에서 N까지 번호가 매겨진 보드에서 게임을 하고 있다고 가정해 보겠습니다. 그리고 N-1 도로. 도로는 두 개의 셀을 연결합니다. 따라서 i번째 도로는 A[i]와 B[i]를 연결합니다. 인접한 셀로 반복적으로 이동하여 다른 모든 셀에서 모든 셀에 도달할 수 있습니다. 처음에 셀 1은 검은색으로 표시되고 셀 N은 흰색으로 표시됩니다. 다른 셀은 착색되지 않습니다. Amal이 먼저 플레이하고 번갈아 플레이합니다. Amal은 검은색 셀에 인접한 무색 셀을 선택하여 검은색으로 칠합니다. Bimal은 흰색 셀에 인접한 무색 셀을 선택하고 흰색으로 칠합니다. 플레이어가 세포를 칠할 수 없을 때 그는 집니다. 승자를 찾아야 합니다.

따라서 입력이 A =[3, 1, 3, 7, 5, 1]과 같으면; B =[6, 2, 1, 4, 7, 4]인 경우 출력은 Amal이 됩니다. Amal이 먼저 셀 2를 검은색으로 칠하면 Bimal의 이동에 관계없이 승리하기 때문입니다.

단계

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

N :=99999하나의 인접 목록 정의 adjListDefine 세 개의 큰 배열 p, d 및 ssz함수 dfs()를 정의하면 nd, par, dep, p[nd] :=par d[nd] :=dep ssz [nd] :=adjList[nd]의 각 노드 i에 대해 1, i XOR par가 0이 아닌 경우 수행:dfs(i, nd, dep + 1) ssz[nd] :=ssz[nd] + ssz [i]메인 방법에서 다음을 수행하십시오. n :=A의 크기 초기화 i :=1, i =n, 다음 "Bimal", 그렇지 않으면 "Amal" 

예시

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

#include 네임스페이스 사용 std;int N =99999;vector> adjList(N);vector p(N), d(N), ssz(N ); 무효 dfs(int nd, int par, int dep){ p[nd] =par; d[nd] =dep; ssz[nd] =1; for (int i :adjList[nd]){ if (i ^ par){ dfs(i, nd, dep + 1); ssz[nd] +=ssz[i]; } }}문자열 해결(벡터 A, 벡터 B){ int n =A.size(); for (int i =1; i =n ? "Bimal" :"Amal");}int main(){ vector A ={ 3, 1, 3, 7, 5, 1 }; 벡터 B ={ 6, 2, 1, 4, 7, 4 }; cout <<해결(A, B) < 

입력

{ 3, 1, 3, 7, 5, 1 }, { 6, 2, 1, 4, 7, 4 }

출력

아말