SRM534-div1-1-div2-2-EllysCheckers

来源:互联网 发布:java新建package 编辑:程序博客网 时间:2024/05/01 16:42
zz: http://www.strongczq.com/2012/03/srm534-div1-1-div2-2-ellyscheckers.html

题目原文:
http://community.topcoder.com/stat?c=problem_statement&pm=11791&rd=14727

题目大意:
     两个人玩一个游戏,一个只有一列包含N个格子的棋盘,编号从左到右分别是0, 1, 2,..., N-1。初始时有些格子上有棋子,有些没有。两人轮流下棋,每步移动一个棋子。棋子的移动规则为:
  • a. 如果棋子右边格子是空的,该棋子可以向右移动一格;
  • b. 如果棋子右边有连续的两个棋子,且右边第三个为空格,则可以跳到该空格。
     如果棋子到了棋盘的最右边,那么该棋子就会马上消失。最后没有棋子可以移动的一方输。如果两个人都用最优的策略下棋,给定棋盘上棋子的初始状态,问先手能否胜出。

思路:
     这个题目相对还是比较水的,发现规律了就很容易做了。首先,根据棋子移动的规则,可以确定游戏到最后输了的那个人是因为棋盘上没有棋子了,因为只要棋盘上有棋子那么肯定是可以移动的。假设初始状态各个棋子到最右边格子的距离综合为S。根据规则,每一步棋子的移动要嘛右进1格,要嘛右进3格。所以每一步S要嘛变为S-1要嘛变为S-3,所以S的奇偶性必然发生了变化。也就是说双方各下一步之后S的奇偶性是不变的。结合游戏最终状态是S=0可知如果初始状态是S是偶数则先手必输,否则必赢。

Java代码:
public class EllysCheckers{     public String getWinner(String board)     {          int x = 0;          for(int i = 0; i < board.length(); ++i){               if(board.charAt(i) == 'o'){                    x += board.length() - 1 - i;               }          }          return x % 2 == 1 ? "YES" : "NO";     }}

原创粉丝点击