取石子(三)(尼姆博弈的定理運用)

2021-06-25 19:16:31 字數 2240 閱讀 4021

取石子(三)

時間限制:

1000

ms | 

記憶體限制:

1000

kb

難度:

6

描述

小王喜歡與同事玩一些小遊戲,今天他們選擇了玩取石子。

遊戲規則如下:共有

n堆石子,已知每堆中石子的數量,兩個人輪流取子,每次只能選擇

n堆石子中的一堆,取一定數量的石子(最少取乙個),取過子之後,還可以將該堆石子中剩下的任意多個石子中隨意選取幾個放到其它的任意一堆或幾堆上。等哪個人無法取子時就表示此人輸掉了遊戲。注意,一堆石子沒有子之後,就不能再往此處放石子了。

假設每次都是小王先取石子,並且遊戲雙方都絕對聰明,現在給你石子的堆數、每堆石子的數量,請判斷出小王能否獲勝。

例如:如果最開始有

4堆石子,石子個數分別為

3 1 4 2

,而小王想決定要先拿走第三堆石子中的兩個石子(石子堆狀態變為

3 1 2 2

),然後他可以使石子堆達到的狀態有以下幾種:

3 1 2 2

(不再移動石子)

4 1 1 2

(移動到第一堆乙個)

3 2 1 2

(移動到第二堆乙個)

3 1 1 3

(移動到第四堆乙個)

5 1 0 2

(全部移動到第一堆)

3 3 0 2

(全部移動到第二堆)

3 1 0 4

(全部移動到最後)

輸入

可能有多組測試資料

(測試資料組數不超過

1000)

每組測試資料的第一行是乙個整數,表示

n(1<=n<=10)

第二行是

n個整數分別表示該堆石子中石子的數量。(每堆石子數目不超過

100)

當輸入的n為

0時,表示輸入結束

輸出

對於每組測試資料,輸出

win表示小王可以獲勝,輸出

lose

表示小王必然會敗。

樣例輸入

3

2 1 3

2

1 1

0

樣例輸出

win

lose

思路:

用的是尼姆博弈的乙個定理:

只要是存在奇數個相同的堆數,那就是必勝態。

**如下:

#include#includeint a[110];//a陣列用來統計每個堆數出現的次數。 

int ok(int *a)//判斷是否是奇異局勢,只要存在乙個奇數的堆數,即可判定是非奇異堆數(必勝態)。

int main()

{ int n,i,m;

while(~scanf("%d",&n),n)

{ memset(a,0,sizeof(a));

for(i=0;i

取石子遊戲之尼姆博弈

尼姆博弈 有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝 這種情況與二進位制有著很大的關係,我們用 a,b,c 來表示某種局勢,那麼 0,0,0 必然為奇異局勢,最後乙個面對這個局勢的必敗。0,n,n 也是種奇異局勢。因為如果對手在其中一堆取m個石...

取石子系列 四 取石子(六)(尼姆博弈)

取石子 六 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 最近topcoder的piaoyi和hrdv很無聊,於是就想了乙個遊戲,遊戲是這樣的 有n堆石子,兩個人輪流從其中某一堆中任意取走一定的石子,最後不能取的為輸家,注意 每次只能從一堆取任意個,可以取完這堆,但不能不取...

取 m堆 石子遊戲(尼姆博弈)

description m堆石子,兩人輪流取.只能在1堆中取.取完者勝.先取者負輸出no.先取者勝輸出yes,然後輸出怎樣取子.例如5堆 5,7,8,9,10先取者勝,先取者第1次取時可以從有8個的那一堆取走7個剩下1個,也可以從有9個的中那一堆取走9個剩下0個,也可以從有10個的中那一堆取走7個剩...