第八屆 藍橋杯 填字母遊戲
阿新 • • 發佈:2018-12-21
填字母遊戲
小明經常玩 LOL 遊戲上癮,一次他想挑戰K大師,不料K大師說: “我們先來玩個空格填字母的遊戲,要是你不能贏我,就再別玩LOL了”。
K大師在紙上畫了一行n個格子,要小明和他交替往其中填入字母。
並且:
- 輪到某人填的時候,只能在某個空格中填入L或O
- 誰先讓字母組成了“LOL”的字樣,誰獲勝。
- 如果所有格子都填滿了,仍無法組成LOL,則平局。
小明試驗了幾次都輸了,他很慚愧,希望你能用計算機幫他解開這個謎。
本題的輸入格式為: 第一行,數字n(n<10),表示下面有n個初始局面。 接下來,n行,每行一個串,表示開始的局面。 比如:“**”, 表示有6個空格。 “L”, 表示左邊是一個字母L,它的右邊是4個空格。
要求輸出n個數字,表示對每個局面,如果小明先填,當K大師總是用最強著法的時候,小明的最好結果。 1 表示能贏 -1 表示必輸 0 表示可以逼平
例如, 輸入: 5
LL LLL LL OO****L 例如, 輸入: 0 -1 1 1
例如, 輸入: 3 OOLLOL L*OO**** O* 例如, 輸入: 1 0 0 資源約定: 峰值記憶體消耗 < 256M CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入…” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。 注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。 注意:主類的名字必須是:Main,否則按無效程式碼處理。
思路:使自己先立於不敗,能贏則贏 時間複雜度為2N吧 比網路上的其他遞迴什麼的 快!!!
import java.util.Scanner; public class FillLetter { private static String[] game; public static void main(String[] args) { Scanner scan=new Scanner(System.in); int n=scan.nextInt(); game=new String[n]; for (int i = 0; i <n; i++) { game[i]=scan.next(); } f(); scan.close(); } public static void f() { for (int i = 0; i < game.length; i++) { char[] ch=game[i].toCharArray(); if (one(ch, 0, ch.length)==0) { System.out.println(method(ch, 0, ch.length)); }else System.out.println(1); } } //判斷能否直接第一步取勝,不能才呼叫method走法 public static int one(char[] ch,int index ,int len) { int flag=0; for (int i = 0; i < len; i++) { if (ch[i]=='*') { if ((i+1<len&&i>0&&ch[i+1]=='L'&&ch[i-1]=='L') ||(i>1&&ch[i-2]=='L'&&ch[i-1]=='O') ||(i+2<len&&ch[i+2]=='L'&&ch[i+1]=='O') ) { flag=1; return flag; } } } return flag; } public static int method(char[] ch,int index ,int len) { int flag=0; while (len>index) { while (true) { if (index<len&&ch[index]!='*') index++; else break; } if (index>=len) { break; } if (len>index&&ch[index]=='*') { if((index>1&&ch[index-2]=='L'&&ch[index-1]=='O')){ ch[index]='L'; flag=1; index++; }else if (index+2<=len-1&&ch[index+2]=='L'&&ch[index+1]=='O') { ch[index]='L'; flag=1; index++; }else if (index>0&&index<len-1&&ch[index-1]=='L'&&ch[index+1]=='L') { ch[index]='O'; flag=1; index++; }else if(index+1<len&&ch[index+1]=='O') { ch[index]='O'; flag=0; index++; }else { ch[index]='L'; flag=0; index++; } } if (flag==1) { break; } while (true) { if (index<len&&ch[index]!='*') index++; else break; } if (index>=len) { break; } if (len>index&&ch[index]=='*') { if((index>1&&ch[index-2]=='L'&&ch[index-1]=='O')){ ch[index]='L'; flag=-1; index++; }else if (index+2<=len-1&&ch[index+2]=='L'&&ch[index+1]=='O') { ch[index]='L'; flag=-1; index++; }else if (index>0&&index<len-1&&ch[index-1]=='L'&&ch[index+1]=='L') { ch[index]='O'; flag=-1; index++; }else if(index+1<len&&ch[index+1]=='O') { ch[index]='O'; flag=0; index++; }else { ch[index]='L'; flag=0; index++; } } } return flag; } }