总共涉及到的四个博弈论题,具体看我的下列四篇文章:
尼姆博弈
巴什博奕
威佐夫博弈
斐波那契博弈
尼姆博弈
#include<bits/stdc++.h>
using namespace std;
int n,t,ans;
int main(){
cin>>n;
while(n--)scanf("%d",&t),ans^=t;
if(ans)cout<<"先手必胜"<<endl;
else cout<<"先手必败"<<endl;
}
巴什博奕
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;cin>>n>>m;
if(n%(m+1)==0)cout<<"先手必败"<<endl;
else cout<<"先手必胜"<<endl;
}
威佐夫博弈
#include<bits/stdc++.h>
using namespace std;
#define Swap(a,b){int temp=a;a=b;b=temp;}
int main(){
int a,b;cin>>a>>b;
if(a>b)Swap(a,b);
int ans=(b-a)*((1.0+sqrt(5))/2.0);
if(ans==a)cout<<"先手必败"<<endl;
else cout<<"先手必胜"<<endl;
}
斐波那契博弈
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int f[maxn];
map<int,int>m;
void solve(){
f[1]=1,f[2]=2;
for(int i=3;i<=maxn;++i)f[i]=f[i-1]+f[i-2],m[f[i]]=1;
}
int main(){
int n;
while(~scanf("%d",&n)){
if(m[n]==1)printf("先手必败");
else printf("先手必胜");
}
}