BZOJ1457 棋盘游戏
生活随笔
收集整理的這篇文章主要介紹了
BZOJ1457 棋盘游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1457
?
這題神奇一些就在于這題的勝利條件不是拿走最后一張牌了而是走到(0,0)。
?
然后就需要大概的轉化一下了。
觀察到SG函數中如果沒有石子了,說明不能移動了,此時SG=0。
?
首先我們將所有能一步走到(0,0)的位置A集合特殊考慮,這些位置顯然是先手必勝的,那么有一些位置B是只能走到這些先手必勝的位置上的,我們就可以把它們的SG函數定為0了。
然后現在的問題成了一個棋盤,走到B集合就不能再移動了,不能移動者輸。
于是就是一個很經典的NIM游戲了,注意在SG函數的推導中那些A集合中的點是不考慮的。
?
#include<cstdio> #include<cstring> #include<algorithm>using namespace std;const int maxn=110; const int maxt=maxn*maxn;int n; int x[maxn*10],y[maxn*10]; int SG[maxn][maxn]; int T[maxt];void Init(){int Idex=0;for(int i=1;i<=100;i++)for(int j=1;j<=100;j++)if(i!=j){Idex++;for(int k=1;k<i;k++) if((i-k)!=j) T[SG[i-k][j]]=Idex;for(int k=1;k<j;k++) if(i!=(j-k)) T[SG[i][j-k]]=Idex;for(int k=min(i,j)-1;k>=1;k--) T[SG[i-k][j-k]]=Idex;for(int k=0;k<maxt;k++)if(T[k]!=Idex) {SG[i][j]=k;break;}} }int main(){ #ifndef ONLINE_JUDGEfreopen("1457.in","r",stdin);freopen("1457.out","w",stdout); #endifInit();int kase;scanf("%d",&kase);while(kase--){int ans=0;bool Find=false;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&x[i],&y[i]);if(!x[i] || !y[i] || x[i]==y[i]) Find=true;ans^=SG[x[i]][y[i]];}if(Find)puts("^o^");else{if(ans>0) puts("^o^");else puts("T_T");}}return 0; } View Code?
轉載于:https://www.cnblogs.com/Robert-Yuan/p/5282620.html
總結
以上是生活随笔為你收集整理的BZOJ1457 棋盘游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ThreadLocal小记
- 下一篇: AutoHotkey 使用笔记