官方題解:我們依次分析每一種棋子。
①王。首先注意乙個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一塊報數,看誰先報到...