這是中國民間的乙個遊戲。兩人從1開始輪流報數,每人每次可報乙個數或兩個連續的數,誰先報到n(n < 1000000001),誰就為勝方。現要你判斷是先手勝還是後手勝。
有多組資料,每一行只有乙個n;
如果是先手勝,輸出no,否則輸出yes;
no(一)倒推法
搶30是我國民間的乙個兩人遊戲, 具有很強的對抗性和娛樂性.搶30遊戲通常有兩種玩法.
(1)兩人從1開始輪流報數, 每人每次可報乙個數或兩個連續的數, 誰先報到30, 誰就為勝方.
(2)兩人從1開始輪流報數, 每人每次可報乙個數或兩個連續的數, 同時把兩個人報出的所有數累加, 誰先使這個累加數最先達到30, 誰就為勝方.
解決最個問題的一般策略是用倒推法.
以(1)為例, 要搶到30, 必須搶到27;要搶到27, 必須搶到24.如此倒推回去, 可得到一系列關鍵數30、27、24、21、18、……9、6、3.
根據以上分析, 搶30遊戲本身並不是乙個公平的遊戲, 初始數和先後順序已經決定了最後的結果, 因為只有後報數者才能搶到3的倍數, 後報數者有必勝策略.
(二)關鍵因子
所有這些關鍵數都是3的倍數.3是兩個報數者年內能夠報出的最大數與最小數的和.在類似遊戲中, 我們把遊戲者所能用到的最大數和最小數之和稱之為關鍵因子k, 關鍵數就是k的倍數…在搶30的遊戲中, 關鍵因子k等於3.
又例如, 搶100報數遊戲中, 如果每人可報數為1至9個連續的自然數, 誰先報到100誰就是勝利者.這裡的關鍵因子k就是可報最大數9和可報最小數1的和, 即k = 10.
報數獲勝的策略就是:(1)讓對方先報數;(2)每次報數為關鍵因子減去對方所報數.這樣自己每次所報數都是關鍵數.
則若n為3的倍數,則後手才可以搶到3的倍數,若不是3的倍數則先手可以搶到 n % 3 ,之後只需要搶到 n % 3 + 3 ,即可獲勝,例如,n為5,則關鍵在於搶到2
**只需要判斷n是否為3的倍數:
#include
using
namespace std;
intmain
(int argc,
char
* ar**)
return0;
}
關於「搶n遊戲」的演算法
題目 中國古代民間有這樣乙個遊戲 兩個人從1開始輪流報數,每人每可報乙個數或兩個連續的數,誰先報到n,誰為勝方。現在小張和小王一起玩這個遊戲,小張先報,已知兩邊的決策都無懈可擊,你知道誰是必勝者嗎?現在由系統給出乙個新的目標數n,請你給出對應的必勝者姓名。分析 如果n是三十,則誰先報到27的贏,則誰...
一道智力遊戲趣味程式設計題
題目如下 一副撲克有52張牌,打橋牌時應該把牌分配給四個人,請先設計程式模擬發牌的過程。要求 黑桃用s spaces 表示 紅桃用h heart 表示 方塊用d diamond 表示 梅花用c clubs 表示 問題分析 按照打橋牌的規則,每人應該發到13張牌,在人工發牌時,應該先進行 洗牌 再把牌...
《Python遊戲趣味程式設計》 第7章 飛機大戰
7 飛機大戰 python遊戲開發 圖書簡介可以看這裡 童晶 python遊戲趣味程式設計 新書上架了 本章我們將編寫乙個飛機大戰的遊戲,滑鼠控制飛機移動 按下滑鼠發射子彈,效果如圖7 1所示。首先我們實現背景迴圈滾動 飛機發射子彈 然後實現敵機的控制與得分顯示 遊戲失敗判斷與處理 最後為遊戲新增音...