問題描述
一共有n堆石子,編號1~n,第i堆中有個a[i]個石子。
每一次操作alice和bob可以從任意一堆石子中取出任意數量的石子,
至少取一顆,至多取出這一堆剩下的所有石子。
兩個人輪流行動,取光所有石子的一方獲勝。aice為先手.
給定a,假設兩人都採用最優策略,誰會獲勝?
問題分析
從簡單情況分析,如果輪到你的時候,只剩下一堆石子,那麼此時的必勝策略肯定是把這堆石子全部拿完一顆也不給對手剩,然後對手就輸了。如果剩下兩堆不相等的石子,必勝策略是通過取多的一堆的石子將兩堆石子變得相等,以後如果對手在某一堆裡拿若干顆,你就可以在另一堆中拿同樣多的顆數,直至勝利。如果你面對的是兩堆相等的石子,那麼此時你是沒有任何必勝策略的,反而對手可以遵循上面的策略保證必勝。
如果是三堆石子……好像很難分析了
直接說結論好了。
當a1^a2^a3^......^an==0
時先手輸。
當a1^a2^a3^......^an!=0
時先手贏。
數學問題很神奇,完全沒有道理的和異或運算扯上了關係。記住就好了吧。
問題描述
喬治亞和鮑勃決定玩乙個自己發明的遊戲。他們在紙上畫一排網格,將網格從左到右編號1,2,3,.並在不同的網格上放置n個棋子,例如,如下圖所示:
喬治亞和鮑勃輪流移動棋子。每次玩家會選擇乙個棋子,然後把它移到左邊,而不超過任何其他棋子,或者越過左邊的邊緣。玩家可以自由選擇棋子移動的步驟數,限制棋子必須至少移動一步,而乙個網格最多只能包含乙個棋子。不能移動的玩家輸掉了比賽。
自從「女士優先」之後,喬治亞一直是第一名。假設喬治亞和鮑勃在比賽中都盡了最大的努力,也就是說,如果他們中的乙個知道贏得比賽的方法,他或她就能做到這一點。
考慮到棋手們最初的位置,你能**誰將最終贏得這場比賽嗎?
輸入輸入的第一行包含乙個整數t(1<=t<=20),測試用例數。接下來是t個病例。每個測試用例包含兩行。第一行由乙個整數n(1<=n<=1000)組成,表示棋子的數量。第二行包含n個不同的整數p1,p2.pn(1<=pi<=10000),這是n個棋手的初始位置。
輸出量對於每個測試用例,列印一行,「喬治亞將贏」,如果喬治亞將贏得比賽;「鮑勃會贏」,如果鮑勃將贏得比賽;否則『不確定』。
樣本輸入23
1 2 3
81 5 6 7 9 12 14 17
樣本輸出
bob will win
georgia will win
**
#define _crt_secure_no_warnings 1
#include#includevoid sort(int a)
for (i = 0; i < len - 1; i++)
}} }
int main()
; int i, j;
scanf("%d", &t);
for (i = 0; i < t; i++)
for (i = 0; i < t; i++)
sort(arr[i]);
for (i = 0; i < t; i++)
if (len % 2 == 1)
}else
}if(rec!=0)
printf("georgia will win\n");
else
printf("bob will win\n");
} system("pause");
return 0;
}
博弈 Nim遊戲
nim遊戲是博弈論中最經典的模型,它又有著十分簡單的規則和無比優美的結論。nim遊戲是組合遊戲 combinatorial games 的一種,準確來說,屬於 impartial combinatorial games 以下簡稱icg 滿足以下條件的遊戲是icg 可能不太嚴謹 1 有兩名選手 2 兩...
NIM遊戲 博弈
1.尼姆博弈 n堆石子,每堆的數量a1,a2,a3.an,一方取完後石子個數為0則該方獲勝,問先手是否必勝 if ans a1 a2 a3 an 0 先手必勝 else 先手必輸 延伸1 在此問基礎上新增乙個集合,集合內的數字是每次操作可取的石子個數,每次從一堆中取,最後無法取者判輸 對每堆石子算得...
博弈 Nim遊戲
1069 nim遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 有n堆石子。a b兩個人輪流拿,a先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n及每堆石子的數量,問最後誰...