基本博弈
(一)巴什博弈(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
解:若为M+1的倍数先手输,否则先手胜
(二)斐波拉博弈(Fibonacci Game):一堆石子有n个,两人轮流取,先取者第1次可以取任意多个,但不能全部取完,以后每次取的石子数不能超过上次取子数的2倍。取完者胜。
解:当N为斐波拉系数时先手输,否则先手胜
(三)威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
关键:
1。任何自然数都包含有且仅有一个奇异局势中。
2。任意操作都可以将奇异局势变为非奇异局势。
3。采用适当方法可将非奇异局势变为奇异局势。
解:当为奇异局势先手输,否则先手胜(见代码)
#include <bits/stdc++.h>
using namespace std;
int main (){
int a,b;
while (scanf("%d %d",&a,&b)!=EOF){
if (a>b)swap(a,b);//保证A<=B
if (a==(int)((b-a)*(1+sqrt(5.0))/2))//判断是不是斐波拉数
printf ("first lose\n");//是则输
else printf ("first win\n");//否则赢
}
return 0;
}
(四)尼姆博弈(Nimm Game):有N堆各若干个物品,两人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
解:N堆石子数异或一下,非零时先手胜。
题目:Hud1850
Nimm Game,问先手胜有几种拿法
特别说明,判断几种拿法时逐堆判断,ans与该堆石子数异或后则该堆石子数异或了两次,所得的值是待被异或为0的值,若这个值小于该堆石数,则可行
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[105],ans,cnt;
while(cin>>n&&n){
ans=cnt=0;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
cin>>a[i];
ans^=a[i];
}
if(ans==0)puts("0");
else{
for(int i=0;i<n;i++){
int k=ans^a[i];
if(k<a[i])cnt++;
}
cout<<cnt<<endl;
}
}
return 0;
}
基础博弈
最新推荐文章于 2023-03-08 14:22:20 发布