阶梯博弈(Nimm's Game)

 

如图是Nim游戏的游戏规则


 

 


 


我们设给出的石头堆的石头数量分别为:a[1],a[2],a[3],...;

Nim游戏的结论是,当且仅当 a[1]^a[2]^a[3]^...==0时先手必输(P-position),否则先手必胜(N-position);


好了,对于Nim游戏的概述到此为止,接下来进行对阶梯博弈的分析,题目如下{}



 

针对本题的游戏规则分析,能够发现,挪动石子的终点,一定是a1的位置;

也就是只有a1不为0,其他均为0时,该局面为必败点(P-position);

因为最终点a1奇数点,不难发现,这是一个只考虑偶数点Nim游戏;

因为在游戏中,当偶数点全部异或得到的值为0时,该局面为必败点(P-position);

当上一位玩家操作奇数点的时候,此时可以将该操作重复一遍,同理于Nim游戏;

只有上一位玩家操作偶数点的时候,局面才会被改变,而此时只需要执行操作,保持偶数点全部异或得到的值为0,即可必胜。


 

最后附上AC代码:

 

#include<bits/stdc++.h>
using namespace std;
int a[10000];//用于记录每堆石头个数的数组
int main()
{
    int n;//石头的堆数
    int chit=0;//用于计算偶数点全部异或的值的变量
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=2;i<=n;i=i+2)//计算偶数点全部异或的值
    {
        chit=chit^a[i];
    }
    if(chit==0)cout<<"MYFNB"<<endl;//异或结果为0则后手必胜
    else cout<<"WDRNB"<<endl;//异或结果不为0则先手必胜
}

 


 

posted @ 2021-05-24 15:10  Re_chit  阅读(127)  评论(0)    收藏  举报