1. 程式人生 > >組合遊戲 && 博弈

組合遊戲 && 博弈

組合遊戲也叫博弈遊戲

我先放上程式碼,之後慢慢講

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;
}