zoukankan      html  css  js  c++  java
  • 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;
    
        }
    }
    

      

  • 相关阅读:
    Django(二)
    Django(一)
    MYSQL理论知识汇总
    默认参数
    深浅拷贝和赋值关系
    bootstrap常用知识
    jQuery常用功能代码
    java集合框架知识总结
    Mysql数据库SQL语句整理
    基于IO流的模拟下载文件的操作
  • 原文地址:https://www.cnblogs.com/dlutjwh/p/10988179.html
Copyright © 2011-2022 走看看