洛谷P2361 yyy棋

来源:互联网 发布:淘宝网客户关系管理 编辑:程序博客网 时间:2024/06/05 05:33

题目描述

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。
0 0