定義p-position和n-position,其中p代表previous,n代表next。直觀的說,上一次move的人有必勝策略的局面是p-position,也就是「後手可保證必勝」或者「先手必敗」,現在輪到move的人有必勝策略的局面是n-position,也就是「先手可保證必勝」。更嚴謹的定義是:1.無法進行任何移動的局面(也就是terminal position)是p-position;2.可以移動到p-position的局面是n-position;3.所有移動都導致n-position的局面是p-position。
注意:對於遊戲的任何一種可能的局面,合法的移動集合只取決於這個局面本身,不取決於輪到哪名選手操作、以前的任何操作、骰子的點數或者其它什麼因素;
歸納為3點:
1) terminal position(終態)為p_position. (先手輸)
2)n_position (先手贏)---存在某個移動----->p_position(當前局勢的先手輸)
3)p_position(先手輸)-----任何移動----->n_position(當前局勢的先手贏)。
當只有兩堆石子且兩堆石子數量相等時後手有必勝策略,也就是這是乙個p-position。我們可以用定義證明:
(2,2)局面是乙個 p_position.
(2,2) ---可以移動的子局面-->(1,2),(0,2)
(1,2) ----可以移動--->(1,1)---唯一移動--->(1,0)---唯一移動--->(0,0)
n_position<--可以--- p_position < --任意 ------ n_ position <--- 因為(0.0)是p_position
(0,2) ---可以移動-->(0,0)
n_position<---可以--p_position
因此, 由於(2,2)的子局面(1,2),(0,2)都是n_position, 故(2,2)是 p_position。
由歸納法 , 同理可得出, 當兩堆有相同石子 的 堆, 該局面為p_position.(即先手輸)。
上面是引子,引出下面的定理:(bouton's theorem):對於乙個nim遊戲的局面(a1,a2,...,an),它是p-position當且僅當a1^a2^...^an=0,其中^表示異或(xor)運算。
申明:
根據定義,證明一種判斷position 性質方法的正確性,只需證明下面三個命題。
1)這個 判斷 一定是將所有的terminal position判斷為 p_position.
2) 根據這個 判斷 被判為 n_position的局面 一定 可以移動 到某個 p_position.
3)根據這個 判斷 被判為 p_position 的局面 無法移動 到 某個 p_position.
證明: bouton's theorem , 中 的判斷是 如果a1^a2^...^an=0 ,則(a1,a2,...,an) 是 p_position
第乙個命題: 顯然成立。 terminal 只有乙個 就是 (0,0,……,0) , 根據判斷a1^a2^...^an===0, 是p_position.
第二個命題: 如果 對於某個局面(a1,a2,...,an) 是 n_position, 則a1^a2^...^an != 0, 一定 存在某個 合法的移動,
將 ai 改變成ai' 後使得a1^a2^...^ai'^...^an=0.
不妨設a1^a2^...^an = k, 則 一定存在某個 ai 它的二進位制表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。 這時令 ai' = ai^k < ai(滿足取石頭要求) 。
則 移動後的局面 是 (a1,a2, ....ai',...,an), 有a1^a2^...^ai'^...^an =a1^a2^...^ai^...^an^k = 0, 為 p_position。命題得證。
第三個命題: 對於某個局面(a1,a2,...,an) 是 p_position,則a1^a2^...^an = 0。 假設可以通過合法的移動, 將 ai 改變成ai' 後 使得a1^a2^...^ai'^...^an
= 0
因為 異或滿足 消除律, 則有 ai = ai', 這不滿足至少取乙個石子,不是合法移動, 故 被判為 p_position 的局面 無法移動到 某個 p_position.
證畢。
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...