原题链接

考察:博弈论

思路:

        当往上走不能再前进时sg(x,y) = 0.在sg函数里模拟行走,记录sg函数的值.最后结果是n个骑士坐标异或

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <set>
 4 #include <cstring>
 5 using namespace std;
 6 const int N = 510;
 7 int f[N][N];//sg[0][0] = 0
 8 int xx[6] = {1,-1,-1,-2,-3,-2};
 9 int yy[6] = {-2,-3,-2,-1,-1,1};
10 int sg(int x,int y)
11 {
12     if(f[x][y]!=-1) return f[x][y];
13     set<int> s;
14     for(int i=0;i<6;i++)
15     {
16         int dx = x+xx[i],dy = y+yy[i];
17         if(dx>=0&&dy>=0) s.insert(sg(dx,dy));
18     }
19     for(int i=0;;i++)
20         if(!s.count(i)) return f[x][y] = i;
21 }
22 int main()
23 {
24     int T,kcase = 0;
25     scanf("%d",&T);
26     memset(f,-1,sizeof f);
27     while(T--)
28     {
29         int n,res = 0;
30         scanf("%d",&n);
31         for(int i=1;i<=n;i++)
32         {
33             int x,y; scanf("%d%d",&x,&y);
34             res^=sg(x,y);
35         }
36         if(!res) printf("Case %d: Bob\n",++kcase);
37         else printf("Case %d: Alice\n",++kcase);
38     }
39     return 0;
40 }