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