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<n,m<=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!
这是一道巴什博弈的题目,同样常规思路我们可以从1*1的方格这样一直往上找奇异局来解题,也可以用画PN图或者用SG函数求解,这道题目我觉得还是用PN图暴力打表来的更无脑更容易一些
P表示这个人到达该点后,下一个人必败。
N表示这个人到达该点后,下一个人必胜。
遵从PN图的三个原则
一、 所有终结点都是必败点P;
二、所有一步能走到必败点P的就是N点;
三、通过一步操作只能到N点的就是P点;
若是kiki走到终点则是他赢,那么就可以将终点记为P。那么终点上面和右面以及右上的点都为N,这样往起点推,若起点是P则kiki会输,否则就能赢。
观察PN图可以知道,若m、n都是奇数,那么起点一定为P,所以只需要判断这个就可以了。
下面附上AC代码
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
ll m,n;
while(cin>>m>>n&&m!=0&&n!=0)
{
if((m-1)%2==0&&(n-1)%2==0)
cout<<"What a pity!"<<endl;
else
cout<<"Wonderful!"<<endl;
}
return 0;
}