POJ 1067 取石子遊戲(威佐夫博弈)

2021-07-15 07:20:09 字數 1881 閱讀 2188

題目鏈結

有兩堆石子,數量分別為\(a,b\),兩個人輪流取石子。每次有兩種不同的取法:一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最優策略,問最後你是勝者還是敗者?

2 1

8 4

4 70 1 0

直接是:威佐夫博弈。

這個過於繁瑣,只能運用現成的結論。

設奇異局勢(必敗局勢)為(a

[i],

b[i]

) ,則有a[

0]=b

[0]=

0 ;a[

k]= 前面未出現的最小自然數,b[

k]=a

[k]+

k 具體求解公式:a[

k]=k

∗1+5

√2,b[k

]=a[

k]+k

=k∗3

+5√2

奇異局勢的性質:

1.任何自然數包含在且僅包含在乙個奇異局勢中 a[

k]>a[

k−1]

,b[k

]=a[

k]+k

>a[

k−1]

+k−1

=b[k

−1]>a[

k−1]

,則任意奇異局勢中不存在相同的自然數(除了(0

,0) ),又a[

k]前面未出現的最小自然數,則任何自然數均會出現在奇異局勢中

2.任意操作均為將奇異局勢變為非奇異局勢

①在一堆中取石子,由於另一堆中的數不會出現在其他奇異局勢中,則新局勢必定非奇異局勢

②在兩堆中同時取石子,由於兩堆石子差值不變,而序號為差值的奇異局勢唯一,則新局勢必定非奇異局勢

3.任意非奇異局勢可以通過特定操作轉化為奇異局勢

設當前局勢為(a

,b) 。 ①a

==b時:同時從兩堆取走

a 個石子,轉化為(0

,0)②

a==a[

k]&&

b>b[

k]時:從第二堆取走b−

b[k]

個石子,轉化為(a

,b[k

]) ③

a==a[

k]&&

bk]時:同時從兩堆取走a−

a[b−

a]個石子,轉化為(a

[b−a

],b−

a+b[

b−a]

) ④a

>a[

k]&&

b==b[

k]時:從第一堆取走a−

a[k]

個石子,轉化為(a

[k],

b) ⑤

ak]&&

b==b[

k]時:若a==

a[j]

(j,則從第二堆取走b−

b[j]

個石子,轉化為(a

,b[j

]);否則必有a==

b[j]

(j,則從第二堆取走b−

a[j]

個石子,轉化為(a

[j],

a)

#include 

#include

#include

#include

using

namespace

std;

int a,b,aa;

double x;

int main()

aa=floor((b-a)*x);//計算第b-a個奇異局勢

printf("%d\n",a==aa?0:1);

}return

0;}

poj1067取石子遊戲 威佐夫博奕

poj1067 description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取...

POJ 1067 取石子遊戲(威佐夫博弈)

題面 取石子遊戲 time limit 1000ms memory limit 10000k total submissions 36951 accepted 12512 description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任...

POJ1067取石子遊戲 威佐夫博弈

一夜落寞,萬物失色。description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都...