您的位置:首页 > 其它

bzoj1457 棋盘游戏

2017-05-30 21:07 330 查看
可以发现,所有横纵坐标相等或者有一个为零的位置都是不能走的位置,这样就转化成了传统的求sg函数的问题。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100;
int vis[maxn*5],sg[maxn][maxn],x[maxn*10],y[maxn*10],n;
int solve()
{
int ans=0;
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for (int i=1;i<=n;i++)
if (!x[i]||!y[i]) return 1;
else ans^=sg[x[i]][y[i]];
return ans;
}
int main()
{
int mx=0;
for (int i=1;i<maxn;i++)
for (int j=1;j<maxn;j++)
if (i!=j)
{
for (int k=0;k<=mx;k++) vis[k]=0;
for (int k=1;k<i||k<j;k++)
{
if (k<i&&i-k!=j) vis[sg[i-k][j]]=1;
if (k<j&&i!=j-k) vis[sg[i][j-k]]=1;
if (k<i&&k<j) vis[sg[i-k][j-k]]=1;
}
for (int k=0;;k++)
if (!vis[k])
{
sg[i][j]=k;
mx=max(mx,k);
break;
}
}
int T;
scanf("%d",&T);
while (T--)
if (solve()) printf("^o^\n");
else printf("T_T\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: