给定一个图,可以根据图示进行6个方向移动,这里只有两个位置限制,最上方的 x x x 轴与最左方的 y y y 轴。
求出每个棋子的 s g sg sg 值,最后将所有的 s g sg sg 值一起异或即可。
求 s g sg sg 的时候进行记忆化搜索。
具体详情请看代码
#include<cstdio>#include<vector>#include<cstring>
using namespace std;typedeflonglong ll;constint N =1e3+10;int sg[N][N];int dir[][2]={
1,-2,-1,-3,-1,-2,-2,-1,-3,-1,-2,1};intgetSG(int x,int y){
if(sg[x][y]!=-1)return sg[x][y];
bool vis[N]={
false };for(int i =0; i <6;++i){
int xx = x + dir[i][0], yy = y + dir[i][1];if(xx >=0&& yy >=0){
vis[getSG(xx, yy)]=1;}}for(int i =0;;++i){
if(!vis[i]){
return sg[x][y]= i;}}}intmain(){
memset(sg,-1,sizeof sg);int T, cas =0;scanf("%d",&T);while(T--){
int n, ans =0;scanf("%d",&n);for(int i =1; i <= n;++i){
int x, y;scanf("%d %d",&x,&y);
ans ^=getSG(x, y);}printf("Case %d: ",++cas);if(ans)puts("Alice");elseputs("Bob");}return0;}