hdu2147 kiki's game(巴什博弈java)

简介: 意思是一个棋子只能往左面,下面,或者左下走。不能走的那个输。kiki先走。

kiki’s game



Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 40000/10000 K (Java/Others)

Total Submission(s): 13497 Accepted Submission(s): 8238


Problem Description


Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes the checkerboard game.The size of the chesserboard is n*m.First of all, a coin is placed in the top right corner(1,m). Each time one people can move the coin into the left, the underneath or the left-underneath blank space.The person who can’t make a move will lose the game. kiki plays it with ZZ.The game always starts with kiki. If both play perfectly, who will win the game?


Input


Input contains multiple test cases. Each line contains two integer n, m (0<=2000). The input is terminated when n=0 and m=0.


Output


If kiki wins the game printf “Wonderful!”, else “What a pity!”.


Sample Input


5 3

5 4

6 6

0 0


Sample Output


What a pity!

Wonderful!

Wonderful!


意思是一个棋子只能往左面,下面,或者左下走。不能走的那个输。kiki先走。


分析一下走法:


O O O O O O O O 
O O O O O O O O 
O O O O O O O O 
O O O O O O O O 
O O O O O O O O 
O O O O O O O O 
O O O O O O O O 
O O O O O O O O 
NNNNNNNN
PNPNPNPN
NNNNNNNN
PNPNPNPN
NNNNNNNN
PNPNPNPN
NNNNNNNN
PNPNPNPN


先考虑走直线,不难发现:如果走直线,向左,向下。从左下角开始找P/N点。画出图。


  • 必败点(P点) :前一个选手(Previous player)将取胜的位置称为必败点。
  • 必胜点(N点) :下一个选手(Next player)将取胜的位置称为必胜点。最后一个点(左下角必败),因为他的前一个人走到该点他就输了。相反,他的附近三个点都是必胜点,因为这个人走一步就赢了。所以分析pn图可以发现(n%2==0)或者(m%2= =0)都是 必胜的。


附上代码如下:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class hdu2147 {
  public static void main(String[] args) throws IOException {
    StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
     PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));     
     while(in.nextToken()!=StreamTokenizer.TT_EOF)
     {
       int n=(int)in.nval;
       in.nextToken();
       int m=(int)in.nval;
       if(m==0&&n==0) {break;}
       if(m%2==0||n%2==0)
       {
         out.println("Wonderful!");
       }
       else
         {out.println("What a pity!");}
       out.flush();      
     }
  }
}


目录
相关文章
|
8月前
|
Java
LeetCode题解-字符串转数字-Java
字符串转数字题解,Java版
51 0
|
机器学习/深度学习 算法 Java
hdu1007最近点对问题(分冶java)
首先这题是我很久前看到的,我那时候用了o(n^2)因为数据量太大,计算太多超时。当时看了别人的分析就说分冶当时看代码太长也就没静下心看。前天翻了数据结构看到分冶算法的最近点问题恍然大悟,一下子就懂了。理解了其中的奥秘。
103 0
hdu1007最近点对问题(分冶java)
|
Java
hdu1846巴什博弈(java)
有一堆石子一共有 n 个,两人轮流进行,每走一步可以取走 1…m 个石子,最先取光石子的一方为胜。 对于博弈的理解,就是围绕找必胜点和必败点而解决问题,首先分析m
102 0
ZZULIOJ-1074,百钱买百鸡(Java)
ZZULIOJ-1074,百钱买百鸡(Java)
ZZULIOJ-1054,猴子吃桃(Java)
ZZULIOJ-1054,猴子吃桃(Java)
ZZULIOJ-1036,某年某月有多少天(Java)
ZZULIOJ-1036,某年某月有多少天(Java)
ZZULIOJ-1007,鸡兔同笼(Java)
ZZULIOJ-1007,鸡兔同笼(Java)
ZZULIOJ-1028, I love 闰年! (Java)
ZZULIOJ-1028, I love 闰年! (Java)
|
Java
HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)
HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)
110 0
|
Java
HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
167 0