比赛的时候不知道如何把棋盘博弈转换为取石子博弈,并且在画马的PN表的时候出错了,没有遵从只N则P的规则,还有就是皇后的走法也没想到是威佐夫博弈,之前没做过,题量少。比完之后,结合别人的想法了解了把棋盘博弈转化为取石子博弈的方法
附上代码:
#include<bits/stdc++.h>
using namespace std;
int a[1002][1002];
int n,m;
int ok(int x,int y)
{
if(x<1||y<1||x>n||y>m)
return 0;
return 1;
}
void df(int x,int y,int v)
{
a[x][y]=v;
if(ok(x-1,y-2)&&a[x-1][y-2]==-1)
{
a[x-1][y-2]=(!v);
}
if(ok(x-2,y-1)&&a[x-2][y-1]==-1)
{
a[x-2][y-1]=(!v);
}
if(ok(x-3,y-3))
df(x-3,y-3,v);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int ty;
scanf("%d %d %d",&ty,&n,&m);
if(ty==4)
{
n--;
m--;
if(n<m)
swap(n,m);
int k=n-m;
n=(int)(k*(1+sqrt(5))/2.0);
if(n==m)
printf("G\n");
else
printf("B\n");
}
else if(ty==2)//yes
{
int ans=0;
ans^=(n-1);
ans^=(m-1);
if(ans>0)
printf("B\n");
else
printf("G\n");
}
else if(ty==3)//yes
{
memset(a,-1,sizeof(a));
df(n,m,0);
/*for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(a[i][j]==1)
{
printf("N ");
}
else if(a[i][j]==0)
{
printf("P ");
}
else
{
printf("D ");
}
}
printf("\n");
}*/
if(a[1][1]==1)
{
printf("B\n");
}
else if(a[1][1]==0)
{
printf("G\n");
}
else
{
printf("D\n");
}
}
else//yes
{
if(n%2==0||m%2==0)
printf("B\n");
else
printf("G\n");
}
}
}