日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ1457 棋盘游戏

發布時間:2025/7/25 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 棋盘游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。