【博弈】填字母遊戲
阿新 • • 發佈:2019-01-28
K大師在紙上畫了一行n個格子,要小明和他交替往其中填入字母。
1. 輪到某人填的時候,只能在某個空格中填入L或O
2. 誰先讓字母組成了“LOL”的字樣,誰獲勝。
3. 如果所有格子都填滿了,仍無法組成LOL,則平局。
小明試驗了幾次都輸了,他很慚愧,希望你能用計算機幫他解開這個謎。
本題的輸入格式為:
第一行,數字n(n<10),表示下面有n個初始局面。
接下來,n行,每行一個串,表示開始的局面。
比如:“******”, 表示有6個空格。“L****”, 表示左邊是一個字母L,它的右邊是4個空格。
要求輸出n個數字,表示對每個局面,如果小明先填,當K大師總是用最強著法的時候,小明的最好結果。
1 表示能贏
-1 表示必輸
0 表示可以逼平
例如,
輸入:
4
***
L**L
L**L***L
L*****L
則程式應該輸出:
0
-1
1
1. 輪到某人填的時候,只能在某個空格中填入L或O
2. 誰先讓字母組成了“LOL”的字樣,誰獲勝。
3. 如果所有格子都填滿了,仍無法組成LOL,則平局。
小明試驗了幾次都輸了,他很慚愧,希望你能用計算機幫他解開這個謎。
本題的輸入格式為:
第一行,數字n(n<10),表示下面有n個初始局面。
接下來,n行,每行一個串,表示開始的局面。
比如:“******”, 表示有6個空格。“L****”, 表示左邊是一個字母L,它的右邊是4個空格。
要求輸出n個數字,表示對每個局面,如果小明先填,當K大師總是用最強著法的時候,小明的最好結果。
1 表示能贏
-1 表示必輸
0 表示可以逼平
例如,
輸入:
4
***
L**L
L**L***L
L*****L
則程式應該輸出:
0
-1
1
1
原始碼:
#include<iostream> #include<string> using namespace std; int get_re(string s){ if(s.find("LOL")!=string::npos){ return -1; } if(s.find("*")==string::npos){ return 0; } int ping=0; for(int i=0;i<s.length();i++){ if(s[i]=='*'){ s[i]='L'; switch(get_re(s)){ case -1:return 1; case 0:ping=1; } s[i]='O'; switch(get_re(s)){ case -1:return 1; case 0:ping=1; } s[i]='*'; } } if(ping==1) return 0; return -1; } int main(){ while(1){ string s; cin>>s; cout<<get_re(s)<<endl; } return 0; }