先贴个代码,博弈问题还要继续深究,special thanks to thinkking!
原题:
Input
Output
SampleInput
2
5 2
2 2
2 3
5 2
3 3
2 3
SampleOutput
Case 1: Alice
Case 2: Bob
#include<iostream>
#include<cmath>
using namespace std;
int n,m;
int dir[2][2]={{-1,-2},{-2,-1}};
bool god(int x,int y)
{
if(x<1||x>500||y<1||y>500)
return false;
return true;
}
int const maxn=510;
int SG[maxn][maxn];
struct node
{
int x,y;
}q[20020];
int v[3];
int main()
{
int ca;
scanf("%d",&ca);
int cn=0;
for(int i=1;i<=500;i++)
{
for(int j=1;j<=500;j++)
{
memset(v,0,sizeof(v));
for(int k=0;k<2;k++)
{
int nx=i+dir[k][0];
int ny=j+dir[k][1];
if(god(nx,ny))
{
v[SG[nx][ny]]=1;
}
}
for(int k=0;k<=2;k++)
{
if(v[k]==0)
{
SG[i][j]=k;
break;
}
}
}
}
while(ca--)
{
cn++;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d",&q[i].x,&q[i].y);
int ans=0;
for(int i=1;i<=m;i++)
{
ans^=SG[q[i].x][q[i].y];
}
if(ans)
printf("Case %d: Alice\n",cn);
else
printf("Case %d: Bob\n",cn);
}
return 0;
}