您的位置:首页 > 其它

URAL 1465 Pawn Game

2013-07-26 13:36 183 查看
取石子博弈,终于搞懂一点sg函数了。

关键在于理解mex的功用,取最小非负整数。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <iostream>
#include <string>
#include <set>
#define X first
#define Y second
#define sqr(x) (x)*(x)
using namespace std;
const double PI = acos(-1.0);
map<int,int>::iterator it;
typedef long long LL ;

int dp[120];
int sg(int n)
{
int &ret =dp
;
if(~ret)return ret;
ret=0;
if(n==0)return ret=0;
if(n==1||n==2)return ret=1;
int i=0;
set<int> S;
S.insert(sg(n-2));
S.insert(sg(n-3));
for(int i=1;i<=n-3;++i)
{
S.insert(sg(i)^sg(n-i-3));
}
for(int i=0;;++i)
{
if(S.find(i)==S.end())return ret=i;
}
}
int main()
{
memset(dp,-1,sizeof(dp));
int n;
while(~scanf("%d",&n))
{
int res;
if(n<68)res = sg(n);
else res = sg((n-68)%34+68);
printf("%s\n",res>0?"White":"Black");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: