플립 게임을 하는 두 명의 플레이어가 있다고 가정합니다. 여기에 + 및 -의 두 문자만 포함된 문자열이 있습니다. player1과 player2는 교대로 두 개의 연속 "++"를 "--"로 뒤집습니다. 한 플레이어가 더 이상 움직일 수 없을 때 게임이 종료되므로 다른 플레이어가 승자가 됩니다. 시작 플레이어가 승리를 보장할 수 있는지 확인하는 함수를 정의해야 합니다.
따라서 입력이 s ="++++"와 같으면 시작 플레이어가 중간 "++"를 "+--+"로 뒤집음으로써 승리를 보장할 수 있으므로 출력은 true가 됩니다.피>
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 지도 메모 정의
-
solve() 함수를 정의하면 s가 소요됩니다.
-
메모에 s가 있으면 -
-
회신 메모[s]
-
-
가능 :=거짓
-
n :=s
의 크기 -
initialize i :=0의 경우, i
-
s[i]가 '+'와 같고 s[i + 1]이 '+'와 같으면 -
-
s[i] :='-', s[i + 1] :='-'
-
가능 :=가능 또는 해결의 역
-
s[i] :='+', s[i + 1] :='+'
-
가능한 경우 0이 아닌 경우 -
-
회신 메모[s] :=가능
-
-
-
-
회신 메모[s] :=가능
-
주요 방법에서 다음을 수행하십시오 -
-
해결 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
unordered_map <string, bool> memo;
bool solve(string s){
if (memo.count(s))
return memo[s];
bool possible = false;
int n = s.size();
for (int i = 0; i < n - 1; i++) {
if (s[i] == '+' && s[i + 1] == '+') {
s[i] = '-';
s[i + 1] = '-';
possible |= !solve(s);
s[i] = '+';
s[i + 1] = '+';
if (possible)
return memo[s] = possible;
}
}
return memo[s] = possible;
}
bool canWin(string s) {
return solve(s);
}
};
main(){
Solution ob;
cout << (ob.canWin("++++"));
} 입력
"++++"
출력
1