สมมติว่ามีผู้เล่นสองคนที่กำลังเล่นเกมพลิก ในที่นี้ เรามีสตริงที่มีอักขระสองตัวนี้เท่านั้น:+ และ -, player1 และ player2 ผลัดกันพลิก "++" สองตัวติดต่อกันเป็น "--" เกมจะจบลงเมื่อผู้เล่นคนหนึ่งไม่สามารถเคลื่อนไหวได้อีกต่อไป ดังนั้นอีกคนหนึ่งจะเป็นผู้ชนะ เราต้องกำหนดฟังก์ชั่นเพื่อตรวจสอบว่าผู้เล่นเริ่มต้นสามารถรับประกันชัยชนะได้หรือไม่
ดังนั้น หากอินพุตเป็น s ="++++" ผลลัพธ์จะเป็นจริง เนื่องจากผู้เล่นเริ่มต้นสามารถรับประกันชัยชนะได้โดยการพลิก "++" ตรงกลางให้เป็น "+--+"พี>
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดบันทึกแผนที่หนึ่งรายการ
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้เวลา s
-
ถ้าอยู่ในบันทึกแล้ว −
-
บันทึกการส่งคืน[s]
-
-
เป็นไปได้ :=เท็จ
-
n :=ขนาดของ s
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ถ้า s[i] เหมือนกับ '+' และ s[i + 1] เหมือนกับ '+' ดังนั้น −
-
s[i] :='-', s[i + 1] :='-'
-
เป็นไปได้ :=เป็นไปได้หรือผกผันของการแก้ปัญหา
-
s[i] :='+', s[i + 1] :='+'
-
ถ้าเป็นไปได้ไม่ใช่ศูนย์ ดังนั้น −
-
บันทึกช่วยจำ [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