POJ 博弈论

Posted dlutjwh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 博弈论相关的知识,希望对你有一定的参考价值。

poj1704 Georgia and Bob

题目链接:http://poj.org/problem?id=1704

题意:如图所示,两个人在玩一个游戏,排成直线的格子上有n个棋子,两人依次将棋子向左移动可以移动任意格子,但是不能超过前面的棋子,也不允许将两个棋子放在同一个格子里面,无法进行移动的一方失败,问对于某个状态先手是否能赢。

技术图片

分析:若n为偶数,则将棋子两两分为一组,转化为Nim,棋子间的格子即为每个数,若右边的格子左移则可视为取走了石子,若左边的格子左移,第二个人只要将增加的格子减去就可回到原来状态;若n为奇数则增加一个零号棋子坐标为零即可

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
int a[1005],n,x;
cin>>x;
    while(x--)
        int n,x=0;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        if(n%2==1)
            a[n++]=0;
        sort(a,a+n);
        for(int i=0;i<n-1;i=i+2)
           x^=(a[i+1]-a[i]-1);
        if(x==0)
            cout<<"Bob will win"<<endl;
         else cout<<"Georgia will win"<<endl;
    

poj2234 Matches Game博弈论

题目链接:http://poj.org/problem?id=2234

题意:有M堆石子,每堆石子的数量已知,有两个玩家,轮流从这些石子中选取某一堆从中拿走若干个,至少拿一个,也可以全拿走,问先手能否取胜

最基本的Nim博弈,直接异或运算

#include<cstdio>
#include<iostream>
using namespace std;
int main()
    int n,a[25];
    while(cin>>n)
        for(int i=1;i<=n;i++)
            cin>>a[i];
            int x=a[1];
        for(int i=2;i<=n;i++)
            x=x^a[i];
        if(x!=0)
            cout<<"Yes"<<endl;
        else cout<<"No"<<endl;

    

  

 

以上是关于POJ 博弈论的主要内容,如果未能解决你的问题,请参考以下文章

POJ2234 Matches Game 尼姆博弈 博弈论

POJ1704Georgia and Bob(博弈论)

POJ2311 Cutting Game(博弈论)

POJ 2484 A Funny Game 博弈论 对称博弈

POJ1067 取石子游戏 威佐夫博弈 博弈论

POJ2505 A multiplication game[博弈论]