组合游戏也叫博弈游戏
我先放上代码,之后慢慢讲
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;
}