码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 博弈论

时间:2019-06-27 00:34:21      阅读:28      评论:0      收藏:0      [点我收藏+]

标签:游戏   状态   geo   异或   cpp   mic   玩家   个人   转化   

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 博弈论

标签:游戏   状态   geo   异或   cpp   mic   玩家   个人   转化   

原文地址:https://www.cnblogs.com/dlutjwh/p/10988179.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!