poj 1067 取石子遊戲 博弈

2021-06-05 02:12:41 字數 1378 閱讀 4692

【題目大意】:有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。(1勝,0負)

【解題思路】:威佐夫博弈(wythoff game)

【威佐夫博弈】: 威佐夫博弈:給出兩堆各若干個物品,兩人輪流從一堆或者同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者獲勝。

設(x,y)表示每一堆的物品的個數,如果某人(假設為甲)面對(0,0)這種局勢,那麼甲就一定輸,這種局勢,我們稱為奇異局勢。

前幾個奇異局勢是:

( 0 , 0 )、( 1 , 2 )、( 3 , 5 )、( 4 , 7 )、( 6 , 10 ) . 可以看出 ,a0=b0=0, ak 是未在前面出現過的最小自然數 , 而 bk=ak+k .那麼任給乙個局勢( a , b ),怎樣判斷它是不是奇異局勢呢?

我們有如下公式:ak =[k ( 1+ √ 5 ) /2] , bk= ak + k ( k=0 , 1 , 2 , ...,n 方括號表示取整函式 )奇妙的是其中出現了**分割數( 1+ √ 5 ) /2 = 1 。 618..., 因此 , 由 ak , bk 組成的矩形近似為**矩形,由於 2/ ( 1+ √ 5 ) = ( √ 5-1 ) /2 ,可以先求出 k=[a ( √ 5-1 ) /2] ,

若 a=[k ( 1+ √ 5 ) /2] ,那麼 a = ak , bk = ak + k ,若不等於,那麼 a = ak+1 , bk+1 = ak+1+ k + 1 ,若都不是,

那麼就不是奇異局勢。然後再按照上述法則進行,一定會遇到奇異局勢。

【**】:

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define eps 1e-8

#define pi acos(-1.0)

#define inf 1<<30

#define pb push_back

#define lc(x) (x << 1)

#define rc(x) (x << 1 | 1)

#define lowbit(x) (x & (-x))

#define ll long long

const double gold=1.6180339887498948482045-1;

int x,y,m,n;

int main()

}return 0;

}

Poj 1067 取石子遊戲 博弈

取石子問題。具體不會,看別人的解題報告。具體不怎麼懂,先帖到這裡 問題分析 威佐夫博奕 wythoff game 有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。這種情況下是頗為複雜的。我們用 ak,bk ak bk k 0,1,2,...

POJ1067取石子遊戲(博弈)

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

POJ 1067 取石子遊戲 (博弈)

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