石子遊戲,取石子遊戲
http://blog.csdn.net/pipisorry/article/details/39120867
問題描述:
甲乙兩人面對若干堆石子,其中每一堆石子的數目可以任意確定。 兩人輪流按下列規則取走一些石子,遊戲的規則如下: 1.每一步應取走至少一枚石子; 2.每一步只能從某一堆中取走部分或全部石子; 3.如果誰無法按規則取子,誰就是輸家。 如果甲乙兩人都採取最優的策略,甲先拿,請問,是甲必勝還是乙必勝. 輸入格式: 多組資料,每組資料兩行,第一行是一個整數N, 2<=N<=10000 下一行是N個正整數,代表每堆的石子數,石子數在32位整數內。 輸出格式: 每組測試資料輸出一行,如果甲存在必勝策略,輸出"Win",否則輸出"Lost"
problem from [http://hero.csdn.net/]
挑戰規則:
輸入範例
3 3 3 1
輸出範例:
Win
解決方案code:
from:
http://blog.csdn.net/pipisorry/article/details/39120867
ref:
取石子遊戲
這是數論中的最優策略問題,沒有平均數原理。
我好好想想再給你答案。
要上班了,下班繼續思考……(時間不多,才回複,見諒)
1. 從50中取走32粒剩餘18粒是正確的。
2. 演算法:從其中一堆中取n個,使得剩餘的所有數目正好是“必負局(此時先取必輸的局面)”。
3. 所謂“必負局”是指把剩餘的每一堆的數目都轉化成二進位的數,然後把它們相加,規定做不進位的加法(也就是異或運算),即0+0=0,1+0=0,0+1=1,1+1=0(不進位),如果所得和是0(多個0),那麼此種局勢稱為“必負局”。
4. “必負局”原理:一個“必負局”,一次改動任何一個數,都將不再是“必負局”,同時,任何一個“非必負局”,通過正確地減少某個數,一定能變成“必負局”,並且這種操作是唯一的。設想現在是“必負局”,假如你先取,勢必把其中的某個數的1改成了0,0改成了1,一定不再是“必負局”了,而我一定可以在把它變會“必負局”。其實這樣的局勢,相當於偶數,你取了,必定有對應我取的,所以我一定拿到最後一個。簡單的想,考慮只有兩堆,那麼如果原來不相等,那就是“非必負局”,先取者有必勝方式,只要取多的一堆使得兩堆相等,之後你取幾個,我就從另一堆取幾個。
5. 應用:(也許格式會改變)
19 010011
7 000111
5 000101
3 000011
010010 (18)10
也就是,還要18才能變成“必負局”,所以50-18=32
所以第1次只能在第5堆石子中取32粒,使得取出32粒後為“必負局”,即異或運算結果為0。
石子遊戲
雙方都採取最好的策略,這個有點難度。
不過我會慢慢想的,說不定幾天后就能做出來