Game of Hyper Knights LightOJ - 1315
考察:博弈论
思路:
当往上走不能再前进时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 }