1. 程式人生 > >第八屆 藍橋杯 填字母遊戲

第八屆 藍橋杯 填字母遊戲

填字母遊戲

小明經常玩 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 表示可以逼平

例如, 輸入: 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;
	}

}