博弈论—NP图法kiki's game HDU - 2147

这里写图片描述

题解:这一题用NP图来进行求解,分别画出 偶X奇,偶X偶,奇X奇的矩阵来找出规律来即可求出结果。
NP图的画法:

博客: https://blog.csdn.net/Adusts/article/details/81385588

以下内容为借鉴,因为写的很好,没啥要补充的。
博弈论:组合博弈
* 必败点(P点) :前一个选手(Previous player)将取胜的位置称为必败点。
* 必胜点(N点) :下一个选手(Next player)将取胜的位置称为必胜点。
* 必败(必胜)点的属性:
* (1) 所有终结点是必败点(P点);
* (2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);
* (3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点).
* 由上面的属性得到该题的算法:
* 步骤1:将所有终结位置标记为必败点(P点);
* 步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
* 步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;
* 步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。

关于博弈问题,较为常用的是P/N图分析法

p n p n p n p n
n n n n n n n n
p n p n p n p n
n n n n n n n n
p n p n p n p n
n n n n n n n n
p n p n p n p n

实际上就是按照规则画图;有以下三条规则:
number one :每个图的末状态均为必败点P
number two: 所有能够一步到达必败点的都是必胜点N
number three: 所有能够一步到达必胜点的都是必败点 P
画图的时候,选定对角线定点里面的那个点位末状态,题上的说明,那么一般找的规则就是从最底边上,还有最开始的那一列开始确定P还是N点,这样很方便的看出,当行列都是奇数的时候,那么一定会必败点。

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#define LL long long int
using namespace std;
int n,m,sg[2001][2001]; 
int main()
{
    while(~scanf("%d%d",&n,&m)&&n+m!=0)
    {
        if(n%2==0||m%2 == 0) cout<<"Wonderful!"<<endl;
        else
        cout<<"What a pity!"<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40240576/article/details/82630992