題意:乙個西洋棋棋盤,有四種棋子,從(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一塊報數,看誰先報到...