小明經常玩 LOL 遊戲上癮,一次他想挑戰K大師,不料K大師說:
“我們先來玩個空格填字母的遊戲,要是你不能贏我,就再別玩LOL了”。
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
資源約定:
峯值內存消耗 < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。
所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
package 藍橋杯學習.填字母;
import java.util.Scanner;
//博弈問題
public class lq {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = Integer.valueOf(cin.nextLine());
while (n-- > 0) {
System.out.println(dfs(cin.nextLine()));
}
}
private static int dfs(String str) {
if (str.contains("LOL")) {
return -1;
}
if (!str.contains("*")) {
return 0;
}
int ping = 0;
char[] cs = str.toCharArray();
for (int i = 0; i < cs.length; i++) {
if (cs[i] == '*') {//前提這個位置沒有被填
cs[i] = 'L';//試着填入L
switch (dfs(new String(cs))) {
case -1:
return 1;
case 0:
ping = 1;
}//如果上面沒有return 1 ,那麼我們再嘗試填入O
cs[i] = 'O';//試着填入O
switch (dfs(new String(cs))) {
case -1:
return 1;
case 0:
ping = 1;
}
//既然這個位置既不能填L,也不能填O,那麼說明這個位置不適合填,那麼讓i++,去嘗試填下一個位置
cs[i] = '*';//回溯,代表我沒填
}
}
//如果上面的遞歸函數結束了,沒有return 1 ,那麼說明我已經無法贏對手了,那麼這是看能不能平手
if (ping > 0) {
return 0;
}
return -1;
}
}