//FAFU 1027 knight 博弈 SG函数
/*
题意:给定一张M*N的图,给T匹马的坐标
1)甲乙两个人轮流选择其中一匹马走,不能不走;
2)每匹马只能从它的左下方两个方向走;
3)无路可走的算输。
思路:预处理算出每个坐标点的SG值,然后^
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1005
int sg[N][N];
int dir[][2] = {-1,-2,-2,-1};
bool vis[5];
void init(){
int i,j,k;
for(i = 0; i <= 1000; ++i)
for(j = 0; j <= 1000; ++j){
memset(vis,false,sizeof(vis));
for(k = 0; k < 2; ++k){
int x = i + dir[k][0];
int y = j + dir[k][1];
if(x<0 || y<0)
continue;
vis[sg[x][y]] = true;
}
for(k = 0; k <= 2; ++k)
if(!vis[k])
break;
sg[i][j] = k;
}
}
int main(){
init();
int n,i,ans,a,b;
while(scanf("%d",&n)!=EOF){
ans = 0;
for(i = 1; i <= n; ++i){
scanf("%d %d",&a,&b);
ans ^= sg[a][b];
}
puts(ans?"1":"0");
}
return 0;
}
FAFU 1027 knight 博弈 SG函数
最新推荐文章于 2017-06-26 11:41:00 发布
本文探讨了在给定的M*N棋盘上,两匹马的移动规则下,甲乙两人轮流选择马进行移动直至无法移动的游戏策略,通过预处理计算每个坐标点的SG值来解决此博弈问题。
5682

被折叠的 条评论
为什么被折叠?



