标题:抓人游戏 出处:Felix021 时间:Sun, 08 Jun 2008 23:38:03 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?970 内容: WHUACM 20080608 Day4个人赛B题 描述:在一个N*M的矩阵中有两个人AB分别处于行列都不相同的两个位置。AB轮流走动,可以在棋盘范围内上下左右走任意步数。若某个人停在或走过对方当前所在的行或列,则对方赢。给出矩阵的大小和AB的初始位置,A先走,如果AB都尽可能走好,问谁会赢。 分析: 不失一般性的设AB所在的位置分别为(Ax,Ay) (Bx,By), Ax1 y=1,那么A显然要赢:A走到(x-1,0),根据前面所说,A就可以把B逼到右下角的位置,于是A赢。换成x=1 y>1结果也是A赢。 3.如果x=y=2,那么如果A向下走一步,B向左走一步;或者A向右走一步,B向上走一步。于是A就只能往回走,B跟上,就回到了情况1。 …… 多推导几个就会发现,其实所有情况可以归类为 a. x=y 和 b. x!=y 两种情况 a. x=y,如果A向下n步,B向左n步;或者A向右n步,B向上n步。于是B可以把A逼到(0,0), 自己在(x-n, y-n),反复下去就回到情况1,B赢。 b. x!=y, 假设x>y,那么A可以走到(x-y, 0) B在(x, y),这时B要先走,这就等同于AB互换名字的情况a,A赢。 于是解法就出来了: if(abs(Ax-Bx)==abs(Ay-By){ printf("A will win.\n"); }else{ printf("B will win.\n"); } Generated by Bo-blog 2.1.0