(博弈論) 51NOD 1069 Nim遊戲
阿新 • • 發佈:2018-09-15
示例 temp 51nod retext ... 模型 inpu bsp pri
有N堆石子。A B兩個人輪流拿,A先拿。每次只能從一堆中取若幹個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設A B都非常聰明,拿石子的過程中不會出現失誤。給出N及每堆石子的數量,問最後誰能贏得比賽。
例如:3堆石子,每堆1顆。A拿1顆,B拿1顆,此時還剩1堆,所以A可以拿到最後1顆石子。
Input
第1行:一個數N,表示有N堆石子。(1 <= N <= 1000) 第2 - N + 1行:N堆石子的數量。(1 <= A[i] <= 10^9)Output
如果A獲勝輸出A,如果B獲勝輸出B。Input示例
3 1 1 1Output示例
A
解:博弈論的經典模型之一,結論很神奇。
(Bouton‘s Theorem)對於一個Nim遊戲的局面(a1,a2,...,an),它是B(後操作者)獲勝當且僅當a1^a2^...^an=0,其中^表示異或(xor)運算。
想了快一天了,知其然不知其所以然。用平衡和非平衡解釋還是挺好理解的,就是不知道是怎麽想到如何定義平衡的。
1 #include <stdio.h> 2 3 int main() 4 { 5 int n; 6 while (scanf_s("%d", &n) != EOF) 7 { 8 int ans = 0; 9 while (n--) 10 { 11 int temp; 12 scanf_s("%d", &temp); 13 ans ^= temp; 14 } 15 16 printf("%c\n", ‘B‘ - (ans ? 1 : 0)); 17 } 18 }
(博弈論) 51NOD 1069 Nim遊戲