hdu5754各種博弈

2021-07-15 15:14:07 字數 1186 閱讀 3416

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

①王。首先注意乙個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也是可以做的。

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

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

#include 

#include

#include

using

namespace

std;

int t,m,n;

int t;

int main()

else

if (t==2)//車

else

if (t==3)//馬

else

if (t==4)//後 威佐夫博弈

}return

0;}

各種博弈 HDU5754

題意 乙個西洋棋棋盤,有四種棋子,從 n,m 走到 1,1 走到 1,1 的人贏,先手贏輸出b,後手贏輸出g,平局輸出d。題解 先把從 n,m 走到 1,1 看做是從 1,1 走到 n,m 四種棋子的規則如下 1 王 king 橫 豎 斜都可以走,每次限走一格 2 車 rook 橫 豎均可走,不能斜...

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一塊報數,看誰先報到...