博弈问题(巴什博弈 威佐夫博弈 尼姆博弈 斐波拉契博弈)结论
Posted koris-yyf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了博弈问题(巴什博弈 威佐夫博弈 尼姆博弈 斐波拉契博弈)结论相关的知识,希望对你有一定的参考价值。
巴什博弈
有一堆n个石子从里面取,一次从里面取1~m个,最后取完者获胜。
结论:如果n%(m+1)==0 先手必败 n%(m+1)!=0为先手必胜。
HDU 4764
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
if((n-1)%(m+1)!=0)
cout<<"Tang"<<endl;
else
cout<<"Jiang"<<endl;
}
}
威佐夫博弈
有两堆石子,每次要么从一堆中取任意个,最少为1;要么从两堆中取出相同个,最后取完者获胜。
结论:用最大的一堆减去最小的一堆的值*(1+sqrt(5)/2) 如果等于较小的那堆个数,先手必败 否则先手必胜。
尼姆博弈
任意堆石子,每次从中取任意个石子,最少为一个,最后取完者获胜。
结论:将所有堆的石子异或起来,如果等于0先手必败,否则先手必胜。
HDU2176
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,a[10005];
while(cin>>n)
{
int k,tmp=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
tmp^=a[i];}
if(tmp==0)
cout<<"No"<<endl;
else
{
cout<<"Yes"<<endl;
for(int i=0;i<n;i++)
{
int t=tmp^a[i];
if(t<a[i])
{
cout<<a[i]<<" "<<t<<endl;
}
}
}
}
return 0;
}
斐波拉契博弈
一堆物品轮流取,每次最少一个最多无上限,后一次最多为前一次的两倍,最少一个,最后取完者胜利。
结论:当n不是斐波拉契数,先取者胜利,反之后者。
HDU2516
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N = 55;
int f[N];
void Init()
{
f[0] = f[1] = 1;
for(int i=2;i<N;i++)
f[i] = f[i-1] + f[i-2];
}
int main()
{
Init();
int n;
while(cin>>n)
{
if(n == 0) break;
bool flag = 0;
for(int i=0;i<N;i++)
{
if(f[i] == n)
{
flag = 1;
break;
}
}
if(flag) puts("Second win");
else puts("First win");
}
return 0;
}
以上是关于博弈问题(巴什博弈 威佐夫博弈 尼姆博弈 斐波拉契博弈)结论的主要内容,如果未能解决你的问题,请参考以下文章