常用博弈模板(純模板 利於記憶)
阿新 • • 發佈:2018-05-31
turn break scan ons strong return ring ash ostream 1、巴什博奕(Bash Game):只有一堆n個物品,兩個人輪流從這堆物品中取物,規
2、威佐夫博奕(Wythoff Game):有兩堆各若幹個物品,兩個人輪流從某一堆取任意數量或同
3、尼姆博奕(Nimm Game):有三堆各若幹個物品,兩個人輪流從某一堆取任意多的
1、巴什博奕(Bash Game):只有一堆n個物品,兩個人輪流從這堆物品中取物,規
定每次至少取一個,最多取m個。最後取光者得勝。
#include<iostream> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<cstdio> using namespace std; const int N=1e6+50; const int INF=0x3f3f3f3f; typedef long long ll; int main() { int n,a,b; while(~scanf("%d%d%d",&n,&a,&b)) { int sum=n%(a+b); if(sum==0) printf("WIN\n"); else if(sum<=a) printf("LOST\n"); else printf("WIN\n"); } return 0; }
2、威佐夫博奕(Wythoff Game):有兩堆各若幹個物品,兩個人輪流從某一堆取任意數量或同
時從兩堆中取同樣多的物品,規定每次至少取一個,多者不限,最後取光者得勝。
#include<iostream> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<cstdio> using namespace std; const int N=2e5+50; const int INF=0x3f3f3f3f; typedef long long ll; int a[N]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n<m) { swap(n,m); } int k=n-m; n=(int)(k*(1+sqrt(5.0))/2); if(n==m) printf("0\n");//輸 else printf("1\n");//贏 } return 0; }
3、尼姆博奕(Nimm Game):有三堆各若幹個物品,兩個人輪流從某一堆取任意多的
物品,規定每次至少取一個,多者不限,最後取光者得勝。
#include<iostream> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<cstdio> using namespace std; const int N=2e5+50; const int INF=0x3f3f3f3f; typedef long long ll; int a[N]; int main() { int n; while(scanf("%d",&n)) { if(n==0) break; int sg=0; for(int i=0;i<n;i++) { scanf("%d",a+i); sg^=a[i]; } if(sg==0) printf("No\n"); else { printf("Yes\n"); } } return 0; }
常用博弈模板(純模板 利於記憶)