各種博弈 HDU5754

2021-08-07 10:22:04 字數 2003 閱讀 3217

題意:乙個西洋棋棋盤,有四種棋子,從(n,m)走到(1,1),走到(1,1)的人贏,先手贏輸出b,後手贏輸出g,平局輸出d。

題解:先把從(n,m)走到(1,1)看做是從(1,1)走到(n,m)。

四種棋子的規則如下:

1、王(king):橫、豎、斜都可以走,每次限走一格

2、車(rook):橫、豎均可走,不能斜走,格數不受限制,除王車易位的情況下,平時不能越子

3、馬(knight):每步棋先橫走或豎走一格,再斜走一格(或者橫兩格豎一格,豎兩格橫一格),可以越子

4、後(queen):橫、豎、斜都可以走,格數不受限制,但不能越子

第一種很明顯(1,1)是必敗點,可以走到必敗點的都是必勝點,而只能走到必勝點的都是必敗點,所以很容易得出結論:n,m都為奇數則先手必敗。

第二種把這個問題看做是兩堆石子,取石子問題,是尼姆博弈,異或為0即相等的時候先手必敗。

第三種先n–,m–,把問題轉化為(0,0)是終點,如果n+m不是3的倍數一定是平局;如果是3的倍數,如果nm相等,那麼一定是必敗的,先手減2減1,後手就減1減2,必敗;如果nm不等且n=m+1或者m=n+1,那麼先手必勝,因為可以一步走到必敗點,必勝;其餘情況都是平局,因為如果一方存在贏的情況,另一方可以不走那步,把小的數-2,大的數-1,往牆上靠,誰也贏不了肯定是平局。

注意:n和m相差1不能用異或=1判斷,如果奇數-偶數=1異或確實為1,偶數-奇數=1就不是了,受到以前一道概率dp題的誤導結果wa了好多次,那個題是if((j>>(i-1)^1)==(k>>(i-1))) 是足球淘汰賽,01,23,45一組,和這個題不一樣,要注意。附上那道題:傳送門。

第四種也是看做兩堆石子,取石子問題,是威佐夫博弈。

#include 

#include

#include

#include

#include

#define ll long long

using

namespace

std;

int main()

else

if(t==2)

else

if(t==3)

}else

}return

0;}

官方題解:我們依次分析每一種棋子。

①王。首先注意乙個3*3的棋盤,開始在(1,1),問走到(3,3)誰有必勝策略。

窮舉所有情況,容易發現這是後手贏。

對於nn和mm更大的情況,我們把橫座標每隔3、縱座標每隔3的點都畫出來,這些點都是符合後手勝的。

(因為無論先手怎麼移動,後手都能重新移動到這些格仔,直到到了終點)

如果初始點不在這些點上,就必然是先手勝。因為先手可以立刻移動到上述的點。

②車。注意到,如果目前的位置距離終點的xx和yy座標差相等,一定是後手勝。

(因為先手只能向下或者向右走一段路;無論他往**走,後手往另一維走相同的步數,依然保持這一樣一種狀態。)

反之,先手必然能走到一處相等的位置,轉化為上述問題,所以一定是先手勝。

③馬。同樣還是畫圖可以得到規律。

在大多數情況下都是平局。在模3域下,某些地方會存在先後手贏。

④皇后。

畫畫圖後,我們可以將問題轉化為:

「有兩堆石子,每次可以在一堆裡取任意(非空)顆(相當於是車的走法),或者在兩堆裡取相同(非空)顆(相當於是象的走法),取到最後一顆石子的人獲勝,問先後手誰有必勝策略。」

此題中n\leq 1000n≤1000,可以直接用dp的方法解決。

設f[x][y]為橫座標距離終點x步,縱座標距離終點y步時,必勝的是先手還是後手。

直接轉移的話,可以列舉先手的下一步決策進行轉移,這樣是o(n^3)o(n

​3 ​​ )的。

注意到轉移只是一行、一列或者斜著一列,這些都可以通過字首和,做到最終o(n^2)o(n

​2 ​​ )。

其實對於更大的nn也是可以做的。

由於敘述起來比較麻煩,具體的結論和證明可以參見:

當時做是直接畫圖,在紙上列舉出各種情況,座標可以表示出來

hdu5754各種博弈

官方題解 我們依次分析每一種棋子。王。首先注意乙個3 3的棋盤,開始在 1,1 問走到 3,3 誰有必勝策略。窮舉所有情況,容易發現這是後手贏。對於nn和mm更大的情況,我們把橫座標每隔3 縱座標每隔3的點都畫出來,這些點都是符合後手勝的。因為無論先手怎麼移動,後手都能重新移動到這些格仔,直到到了終...

hdu 5754 多校第3場

比賽的時候不知道如何把棋盤博弈轉換為取石子博弈,並且在畫馬的pn表的時候出錯了,沒有遵從只n則p的規則,還有就是皇后的走法也沒想到是威佐夫博弈,之前沒做過,題量少。比完之後,結合別人的想法了解了把棋盤博弈轉化為取石子博弈的方法 附上 includeusing namespace std int a ...

簡單涉獵各種博弈

一.巴什博奕 bash game a和b一塊報數,每人每次報最少1個,最多報4個,看誰先報到30。這應該是最古老的關於巴什博奕的遊戲了吧。其實如果知道原理,這遊戲一點運氣成分都沒有,只和先手後手有關,比如第一次報數,a報k個數,那麼b報5 k個數,那麼b報數之後問題就變為,a和b一塊報數,看誰先報到...