HDU 2147 kiki‘s game(博弈+NP状态图+规律)

题目传送门
题意:两个人下棋,都绝顶聪明(反正博弈的人都是绝顶聪明的)。棋盘的规模是n*m(n行m列),初始的棋子位于右上角,也就是坐标(1,m)处,游戏的规则是移动这颗棋子,只能将它向左,下,或者左下三种方式移动,最先不能移动棋子的人输。现在先手是老王,问老王是否会赢?若胜利输出Wonderful!,否则输出What a pity!
思路:很明显的博弈题,但是和Bash博弈有点不一样,这题目我们没有办法,只能画NP状态图了,还记得NP状态的如下定义吗
终止局面总是P。
N:本次轮到的人必胜局,其后继状态必存在一种必败局势P
P:本次轮到的人必败局,其后继状态全部都是必胜局势N

举个例子,n = 5 m = 3,画NP图
在这里插入图片描述
起点是P,先手必败,故这局老王必败
但感觉画完图还是不知道这题目的规律,多画几种不同情况,约束不同的n,m数,经过一番波折,最后得出如下结论

  • 若n和m都是奇数,则先手必输,也就是老王必输
  • 反正,先手必胜,也就是老王必胜

代码如下 c++

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
using namespace std;
const int N = 2e3+10;
const double PI = acos(-1.0);

signed main(void)
{
    
    
    int n,p,q,m;
    while(cin>>n>>m&&!cin.eof()){
    
    
        if(n==0&&m==0) break;
        if((n&1)&&(m&1)) cout<<"What a pity!"<<endl;
        else cout<<"Wonderful!"<<endl;
    }
}

博弈真是一门玄学啊

猜你喜欢

转载自blog.csdn.net/YSJ367635984/article/details/113763920