趣題:構造遊戲初始狀態使得後行者必勝
考慮這樣一個雙人對弈遊戲:在一個8x8的方陣裡分別填上1-64這64個正整數。然後A和B兩個人輪流在格子中取數,A先取,B後取。取數的規則很簡單:取過的數不能夠再取,並且除了第一次以外,以後每次取的數必須與某個已經取過的格子相鄰。所有數都取完後,所取數之和最大的人獲勝。
很顯然,這個遊戲對於A更有利一些。我們可以輕易構造一個初始狀態,使得先取的人必勝。考慮A的這樣一個策略:總是取能取的數中最大的一個。如果每次A都可以取走整個棋盤中最大的那個數,那A就贏定了(因為每次B接下來取的數都比A小)。這樣的初始狀態是很容易構造出來的,比如我們只需要從左往右從上至下依次填入這64個數就可以了,這可以保證如果從n到64的所有數都取走了,則n-1也可以被取走。
現在的問題是,能否構造一個初始狀態,使得後取的人有必勝策略?提示,解決這道題需要有超強的“整人”能力。你得想出足夠多的壞點子才能找到弄死先行者的方法。你的心腸壞到足以解決這個問題嗎?
解決問題的關鍵在於,我們要給A埋下“陷阱”。考慮這樣一種區域性構造:奇數個大數彼此相連,這些大數週圍一圈全是小數。上圖就是這樣一個陷阱,鑽石代表大數,其餘黃色的格子都是小數。只要A踩進了某個黃色格子,他就中計了:B和A開始輪流取大數,但大數只有奇數個,因此B獲得的大數比A多一個。為了讓事情變得更簡單,我們只考慮最簡單的一種陷阱:只有一個大數,周圍的鄰格都是小數。我們還有幾個難點:萬一A一開始就把陷阱內的鑽石取走咋辦,又如何避免自己不會掉進陷阱,還有我們必須保證B從這些陷阱裡賺到的足以彌補在其它地方虧的。要想有足夠多的陷阱對A起作用,我們得布上至少三個陷阱,這樣A可以在最能賺的陷阱裡開局,但無法避免落入另外兩個陷阱。為了保證自己不會掉進陷阱,我們可以把棋盤的其餘部分劃分為多米諾骨牌(一個個1x2的小長方形),這樣的話不管A取哪一個格子,B總可以取對應的另一個格子,不會踩到陷阱。於是我們想到了下面的這個構造:
我們在四個陷阱裡分別填上1-2-3-61,4-5-6-62,7-8-9-63,10-11-12-64這四組數,每個多米諾骨牌裡填上兩個相鄰的數。這樣的話,A的最好策略就是從第一個陷阱裡開始取數。他能從第一個陷阱裡賺到(61+2)-(1+3)=59分,但他在其它陷阱裡將分別丟掉(62+4)-(5+6)=55分、(63+7)-(8+9)=53分、(64+10)-(11+12)=51分。而多米諾骨牌一共只有24個,他最多隻能撿24分回來,這是遠遠不夠的。因此,先取者必輸無疑。
參考資料:http://www.brand.site.co.il/riddles/200802q.html
相關文章
- 初始化遊戲狀態資料遊戲
- 撲克遊戲的必勝法則遊戲
- 深入理解Java中靜態初始化塊、初始化塊和構造方法Java構造方法
- XRP在大幅下跌之後反彈,使得加密市場重新回到了溫和狀態加密
- 趣題:建構函式使得平面上任意小的圓內均包含函式上的點函式
- CF 構造題
- 後端的狀態碼後端
- 靜態程式碼塊、構造程式碼塊、構造方法構造方法
- 系統設計架構:有狀態與無狀態架構
- 兩張趣圖幫助你理解狀態碼的含義~
- 恢復oracle的scott使用者初始狀態操作Oracle
- HTTP狀態碼 — 混圈子必備”語言“HTTP
- 短線必勝的操作
- 構造做題筆記筆記
- 請求更改狀態介面後,執行 sql 查出來狀態不對SQL
- win10登錄檔恢復初始狀態的方法Win10
- iOS開發-初始化和便利構造器寫法iOS
- 動態SQL——構造通用動態頁面查詢SQL
- openstack上建立vm例項後,狀態為ERROR問題解決Error
- Effective Java - 靜態方法與構造器Java
- React專題:可變狀態React
- 架構設計(五):有狀態服務和無狀態服務架構
- Xcode 檔案後狀態標識XCode
- 玩家——受傷後的保護狀態
- Spring原始碼系列 —— 構造和初始化上下文Spring原始碼
- 【架構設計】無狀態狀態機在程式碼中的實踐架構
- Android 必知必會 - 根據包名判斷 App 執行狀態AndroidAPP
- 架構師必備:系統容量現狀checklist架構
- 製作遊戲的遊戲:創作樂趣的樂趣遊戲
- 設計模式(二十)——備忘錄模式(遊戲角色狀態恢復問題)設計模式遊戲
- win10怎麼恢復系統初始狀態 win10系統還原成原始狀態的方法Win10
- 域初始化、靜態塊及構造方法等在建立類例項時的執行順序 (轉)構造方法
- 百度造車,勝算幾何?
- Vue同構(三): 狀態與資料Vue
- BGP報文結構&型別、狀態型別
- Linq to Sql : 動態構造Expression進行動態查詢SQLExpress
- Android推斷程式前後臺狀態Android
- ListView起始狀態定位在最後一項View