組合遊戲 && 博弈
阿新 • • 發佈:2018-12-01
組合遊戲也叫博弈遊戲
我先放上程式碼,之後慢慢講
POJ2311
#include <iostream> #include <cstring> #include <set> #include <cstdio> using namespace std; const int maxn = 1010; int mex[maxn][maxn]; int SG(int w,int h) { if(mex[w][h]!=-1) return mex[w][h]; set<int> s; for(int i=2;w-i>=2;i++) s.insert(SG(i,h)^SG(w-i,h)); for(int i=2;h-i>=2;i++) s.insert(SG(w,i)^SG(w,h-i)); int res = 0; while(s.count(res)) res++; return mex[w][h] = res; } int main() { int w,h; memset(mex,-1,sizeof(mex)); while(~scanf("%d%d",&w,&h)) { if(SG(w,h)!=0) { puts("WIN"); } else { puts("LOSE"); } } return 0; }
洛谷P2252
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
if(n>m) swap(n,m);
int tmp = m-n;
int ans = tmp*((sqrt(5.0)+1.0)/2.0);
if(ans==n) cout<<"0"<<endl;
else cout<<"1"<<endl;
return 0;
}
HDU2516
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1010; ll f[maxn]; map<ll,int> vis; void init() { f[0] = f[1] = 1; for(int i=2;i<90;i++) { f[i] = f[i-1]+f[i-2]; } for(int i=0;i<90;i++) { vis[f[i]] = 1; } } int main() { init(); int n; while(cin>>n) { if(n==0) break; if(!vis[n]) cout<<"First win"<<endl; else cout<<"Second win"<<endl; } return 0; }