hdu_oj2147kiki‘s game(巴什博弈+PN图)

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值