題目描述
uim最近在研究一種遊戲,叫做“yyy棋”。
這種遊戲的規則很簡單,就是有一個A*B的棋盤和黑白兩色的棋子,兩個人輪流在下在格子裡面。你可以下黑棋或者白棋,中途可以更換顏色,可以下在任何你喜歡的地方,但是要符合以下條件:
1、這個位置不能已經被別的棋子佔用。
2、你準備下的地方,上下左右一格範圍中不能有和你準備下的顏色一樣的棋子。
3、第一個下的人必須出黑子。
當誰沒有地方可以放子,誰就輸了。
uim把你拉了出來,希望你好好地陪他玩。
由於你很忙不太情願,uim就讓步了,允許你選擇先手或者後手。
你突然靈光一現,想到了你小學奧數做到的一個問題:兩個人坐在一張桌子的兩邊,輪流往桌子上放硬幣,硬幣不能重疊,誰放不下誰就輸了。感覺有點類似,所以,你打算借鑒這個辦法。
你知道,通過某種策略,你一定是100%贏的。
既然如此,就讓uim輸個痛快吧。
輸入輸出格式
輸入格式:
第一行,A,B,兩個整數,表示棋盤大小
接下來若干行,為uim依次下的順序,x_i,y_i,c_i,分別表示位置和顏色,顏色1為黑,0為白。位置均1<=x_i<=A 1<=y_i<=B。
入過uim發現沒地方可走,就可能會耍賴,將棋子下在了不合法的地方。遇到這種情況,你也要指出。當然uim也有可能知道自己輸了後就不下了。不存在遊戲勝負還沒定uim就投降的情況。
輸出格式:
第一行,選擇先手還是後手,先手請輸出“First”,後手輸出“Second”。
接下來幾行,如果你是第一個下子的,請輸出你的第一步下法。然後對uim的下的每一個子做出回應。輸出x_i y_i c_i,意思和上面相同。你必須輸出必勝的下法,否則你將WA這個點。如過多個下法都是必勝點,請輸出個能夠儘早結束遊戲的下法。
在你下完這個子之前,請假裝你不知道uim的下一步走法。
如果uim耍賴,那麼這一行輸出“Buwanle”並結束程式,多餘的輸入就不管它了。
輸入輸出範例
輸入範例#1:
2 2
1 2 1
1 1 1
輸出範例#1:
Second
2 1 0
Buwanle
說明
40%資料,2<=A,B<=3
100%資料,2<=A,B<=9 分析
這個 題沒什麼好說的,只要明確一個規則就好了。那就是中心對稱的原則。
如果(a*b)是奇數,那麼一定有一個中心對稱的點,那麼就要選擇先手,佔據這個中心點,否則選擇後手。然後對手放在哪裡,那麼我一定可以找到另一個對稱的點放棋子。所以才要佔據中心那個點。
對於顏色呢。 如果(a*b)是奇數,那麼就每次選擇和對手下同樣顏色的棋子; 如果是偶數,那麼每次就選擇和對手下不同顏色的棋子。
自己用(2*3)、( 3 * 3)的棋盤類比一下就知道為啥了、 代碼
好像有點亂的代碼。不過還是A了~~~
var num,x,y,z,i,a,b,j:longint; pan:array[1..9,1..9]of integer;function check(x,y,z:longint):boolean;var flag,i,j:integer;begin if (x-1>0)and(pan[x-1,y]=z) then exit(true); if (y+1<=b)and(pan[x,y+1]=z) then exit(true); if (x+1<=a)and(pan[x+1,y]=z) then exit(true); if (y-1>0)and(pan[x,y-1]=z) then exit(true); exit(false);end;begin readln(a,b); for i:=1 to a do for j:=1 to b do pan[i,j]:=-1; if odd(a*b) then begin writeln('First'); writeln(a div 2+1,' ',b div 2+1,' ',1); pan[a div 2+1,b div 2+1]:=1; while not eof do begin readln(x,y,z); pan[x,y]:=z; if (x=0) then begin writeln('Buwanle');halt;end; if check(x,y,z) then begin writeln('Buwanle');halt;end else begin writeln(a-x+1,' ',b-y+1,' ',z); pan[a-x+1,b-y+1]:=z; end; end; end else begin num:=0; writeln('Second'); while not eof do begin readln(x,y,z); if (x=0) then begin writeln('Buwanle');halt;end; inc(num); if (z=0)and(num=1) then begin writeln('Buwanle');halt;end; pan[x,y]:=z; if check(x,y,z) then begin writeln('Buwanle');halt;end else begin writeln(a-x+1,' ',b-y+1,' ',abs(z-1)); pan[a-x+1,b-y+1]:=abs(z-1); end; end; end;end.評測結果:Accepted 得分: 100提交時間:2015-10-18 09:28 耗時:46ms記憶體:3137kb 點擊進入記錄列表。 編譯資訊 Compiling編譯成功 評測結果 Result測試點 #1:通過該測試點。 得分20,耗時0ms,記憶體3137kB。測試點 #2:通過該測試點。 得分20,耗時0ms,記憶體3100kB。測試點 #3:通過該測試點。 得分20,耗時0ms,記憶體3133kB。測試點 #4:通過該測試點。 得分20,耗時31ms,記憶體3137kB。測試點 #5:通過該測試點。 得分20,耗時15ms,記憶體3133kB。