Nim遊戲與階梯Nim博弈

2021-09-22 18:37:01 字數 1816 閱讀 8991

問題描述

一共有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及每堆石子的數量,問最後誰...