gym 101908B Marbles 博弈論SG函數

http://codeforces.com/gym/101908/problem/B

題目大意:

一個100*100的棋盤,座標範圍是[0, 100]的,上面有n個棋子。Alice 和 Bob輪流操作,每次操作可以把一枚棋子向左或者向下或者向斜下方移動任意步,也就是(x,y) 有這三種移動(x-l, y), (x, y-l), (x-l, y-l)。多個棋子可以同時在同一位置。第一個把棋子移動到(0, 0)點的人獲勝。 問是否先手必勝。

 

問題分析:

看完題目我就想,這不就是個Nim遊戲嗎,求一下SG函數異或一下就完了。然而事情沒有那麼簡單,交上去直接就WA了,然後就懵逼了。

其實問題也不是很複雜。該問題跟Nim遊戲有個很大的區別,將Nim遊戲的取石子問題轉化到這個棋盤上的話,失敗條件就是所有的棋子都在(0, 0)點,無法繼續移動。而對該問題而言,你所面對的局面裏面有任意一個棋子在(0, 0)點即視爲失敗。

那麼就考慮把這個問題簡單地轉化爲Nim遊戲的模型。首先如果初始棋子有在x = 0, y = 0, y = x這三條線上的,特判一下輸出Y。然後發現在遊戲的過程中,將棋子移動到這三條線上就相當於必敗,所有棋子肯定不選擇移動到這三條線上。於是我們在計算SG函數的時候剔除掉這三條線。同時我們可以找到(1, 2)和(2, 1)這兩個點,一旦棋子移動到這兩個點,就無法繼續移動了,否則對方就會獲得勝利。那麼(1, 2)和(2, 1)這兩個點就對應着Nim遊戲裏的某一堆石子被取完了。最後的結束條件是所有的棋子都在(1, 2)或者(2, 1)了。至此,問題就轉化爲了普通的有向圖Nim有戲。

總結出最後的解法:將終結態設爲(1, 2)和(2, 1)兩個點,SG函數值設爲0。DFS求所有點的SG函數,過程中跳過兩個座標軸以及y = x這條線上的點。將n個棋子的位置上的SG函數求異或,最後的結果是0就輸出N,否則是Y

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章