bash博弈
代码
#include<iostream>
using namespace std;
int main(void)
{
int cas,total,price;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&total,&price);
if(total%(price+1))
cout<<"先手赢"<<endl;
else
cout<<"先手输"<<endl;
}
return 0;
}
威佐夫(Wythoff)博弈
代码
#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;
int main ()
{
int a,b,dif;
double p=(sqrt((double)5)+1)/double(2);
while(cin>>a>>b)
{
dif=abs(a-b);//取差值
a=a<b?a:b;//取较小的值
if(a==(int)(p*dif))//判断是不是奇异局势
printf("0\n");
else printf("1\n");
}
return 0;
}
Nim博弈
代码
将所有队全部异或,如果结果为0则先手必败,否则先手必胜。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int a[200005],ans[200005][2];
int main()
{
int n,i,j,cnt,s;
while(~scanf("%d",&n),n)
{
cnt = 0;
s = 0;
for(i = 0; i<n; i++)
{
scanf("%d",&a[i]);
s^=a[i];
}
for(i = 0; i<n; i++)
{
if(a[i] > (s^a[i]))
{
ans[cnt][0] = a[i];
ans[cnt][1] = s^a[i];
cnt++;
}
}
if(cnt)//判断先手是胜是负
{
printf("Yes\n");
for(i = 0; i<cnt; i++)
printf("%d %d\n",ans[i][0],ans[i][1]);//输出若先手为胜的走法
}
else
printf("No\n");
cout<<cnt<<endl;//输出使先手为胜的方案的数目
}
return 0;
}