BZOJ 1457 棋盘游戏 SG函数
2017-04-05 09:41
190 查看
题目大意:有一个100 * 100的棋盘,从0开始编号。棋盘上有N个Queen。两个玩家轮流选择其中一个Queen,将它跳到(Xi – k, Yi)或(Xi, Yi - k)或(Xi – k, Yi - k), 其中k > 0。一个格子里面可能出现多个Queen。先将任意一个Queen移动到(0, 0)的人获胜。问先手必胜还是后手必胜?
对于每个queen可以看成是两堆石子,SG函数搞一搞就好
需要注意的是边界和对角线不能走,求SG函数时不要忘了判断
对于每个queen可以看成是两堆石子,SG函数搞一搞就好
需要注意的是边界和对角线不能走,求SG函数时不要忘了判断
#include <cstdio> #include <cstring> #define N 10005 using namespace std; int n,SG[105][105]; int tim,k ; int get_SG(int x,int y) { if(SG[x][y]!=-1) return SG[x][y]; int T=++tim; for(int i=1;;i++) { if(x-i<=0 && y-i<=0) break; if(x-i>0 && x-i!=y) get_SG(x-i,y); if(y-i>0 && y-i!=x) get_SG(x,y-i); if(x-i>0 && y-i>0) get_SG(x-i,y-i); } for(int i=1;;i++) { if(x-i<=0 && y-i<=0) break; if(x-i>0 && x-i!=y) k[get_SG(x-i,y)]=T; if(y-i>0 && y-i!=x) k[get_SG(x,y-i)]=T; if(x-i>0 && y-i>0) k[get_SG(x-i,y-i)]=T; } for(int i=0;;i++) if(k[i]!=T) return SG[x][y]=SG[y][x]=i; } int x ,y ; int main() { memset(SG,-1,sizeof SG); int T; scanf("%d",&T); while(T--) { scanf("%d",&n); bool win=false; for(int i=1;i<=n;i++) { scanf("%d%d",&x[i],&y[i]); if(x[i]==y[i] || !x[i] || !y[i]) win=true; } if(win) { printf("^o^\n"); continue; } int sum=0; for(int i=1;i<=n;i++) sum^=get_SG(x[i],y[i]); if(!sum) printf("T_T\n"); else printf("^o^\n"); } return 0; }
相关文章推荐
- BZOJ 1457 棋盘游戏 SG函数
- BZOJ 1457: 棋盘游戏 SG函数
- bzoj 1457: 棋盘游戏 sg函数
- 【博弈论】【SG函数】bzoj1457 棋盘游戏
- 【博弈】【bzoj 1457】: 棋盘游戏
- BZOJ1457 棋盘游戏
- bzoj1457 棋盘游戏
- 【BZOJ 3106】【CQOI 2013】棋盘游戏
- [BZOJ1874][BeiJing2009 WinterCamp]取石子游戏(博弈SG函数)
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- [SG函数] BZOJ1188: [HNOI2007]分裂游戏
- [SG函数 + 分块] BZOJ4035: [HAOI2015]数组游戏
- bzoj 1188: [HNOI2007]分裂游戏 sg函数
- [BZOJ1188][HNOI2007]分裂游戏(博弈SG函数)
- 【博弈论】【SG函数】【枚举】bzoj1874 [BeiJing2009 WinterCamp]取石子游戏
- bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)
- 【博弈论】【SG函数】【枚举】bzoj1188 [HNOI2007]分裂游戏
- [bzoj3106][cqoi2013][棋盘游戏] (对抗搜索+博弈论)
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
- 【BZOJ3901】棋盘游戏 局部暴枚取优