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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ 3106 棋盘游戏

發布時間:2025/3/13 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 3106 棋盘游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

一個\(n \times n(n \le 2)\)棋盤上有黑白棋子各一枚。游戲者A和B輪流移動棋子,A先走。
A的移動規則:只能移動白棋子。可以往上下左右四個方向之一移動一格。
B的移動規則:只能移動黑棋子??梢酝舷伦笥宜膫€方向之一移動一格或者兩格。
和通常的“吃子”規則一樣,當某游戲者把自己的棋子移動到對方棋子所在的格子時,他就贏了。兩個游戲者都很聰明,當可以獲勝時會盡快獲勝,只能輸掉的時候會盡量拖延時間。你的任務是判斷誰會贏,需要多少回合。
比如\(n=2\),白棋子在\((1,1)\),黑棋子在\((2,2)\),那么雖然A有兩種走法,第二個回合B總能取勝。

Input

輸入僅一行,包含五個整數\(n, r_{1}, c_{1}, r_{2}, c_{2}\),即棋盤大小和棋子位置。白色棋子在\((r_{1},c_{1})\),黑色棋子在\((r_{2},c_{2})(1 \le r_{1},c_{1},r_{2},c_{2} \le n)\)。黑白棋子的位置保證不相同。

Output

輸出僅一行,即游戲結果。如果A獲勝,輸出WHITE \(x\);如果B獲勝,輸出BLACK \(x\);如果二者都沒有必勝策略,輸出DRAW。

Sample Input

2 1 1 2 2

Sample Output

BLACK 2

HINT

\(n \le 20\)

首先有個結論可以判勝負:
如果A與B只相差一格,那么A一定獲勝;否則B一定獲勝。那個平局只是來賣個萌的。(B走的快一些)
然后就是求合法的步數了,這個是CLB告訴我的極大極小搜索。
我開始裸搜果斷TLE,加了記憶化,果斷WA,沒怎么打過,怎么調也調不對,最后還是參照了別人的程序長了見識。

#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> using namespace std;#define inf (1<<30) #define lim (3*n+2) #define maxn (25) const int xx[] = {0,1,0,-1},yy[] = {1,0,-1,0}; int n,X1,X2,Y1,Y2,ans; int vis[maxn][maxn][maxn][maxn][maxn*3][2];inline bool okay(int x,int y) { return x > 0&&x<=n&&y > 0&&y<=n; }inline int dfs(bool now,int a1,int b1,int a2,int b2,int step) {if (step > lim) return inf;if (vis[a1][b1][a2][b2][step][now]) return vis[a1][b1][a2][b2][step][now];else if (a1 == a2&&b1 == b2){if (now) return inf;return 0;}int ret;if (!now){ret = 0;for (int i = 0;i < 4;++i)if (okay(a1+xx[i],b1+yy[i]))ret = max(dfs(now^1,a1+xx[i],b1+yy[i],a2,b2,step+1),ret);}else{ret = inf;for (int j = 1;j <= 2;++j)for (int i = 0;i < 4;++i)if (okay(a2+j*xx[i],b2+j*yy[i]))ret = min(dfs(now^1,a1,b1,a2+j*xx[i],b2+j*yy[i],step+1),ret);}return vis[a1][b1][a2][b2][step][now] = ++ret; }int main() {freopen("3106.in","r",stdin);freopen("3106.out","w",stdout);scanf("%d %d %d %d %d\n",&n,&X1,&Y1,&X2,&Y2);if (abs(X1-X2)+abs(Y1-Y2) == 1) printf("WHITE 1");else{printf("BLACK ");printf("%d",dfs(0,X1,Y1,X2,Y2,0)); }fclose(stdin); fclose(stdout);return 0; }

轉載于:https://www.cnblogs.com/mmlz/p/4306236.html

總結

以上是生活随笔為你收集整理的BZOJ 3106 棋盘游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

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