POJ 博弈论
Posted dlutjwh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 博弈论相关的知识,希望对你有一定的参考价值。
poj1704 Georgia and Bob
题目链接:http://poj.org/problem?id=1704
分析:若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 博弈论的主要内容,如果未能解决你的问题,请参考以下文章