威佐夫博弈有關證明
如果起始狀態為奇異局勢,則為先手必敗;
最後有個公式,判斷給出的(a,b)是否為奇異局勢;
a=[k(1+√5)/2],b= a + k (k=0,1,2,…,n 方括號表示取整函式)
k=[a(√5-1)/2];如果a==[k(1+√5)/2],那麼a=a,b=a+k,否則a=a+1,b=
a+k+1;滿足條件就是奇異局勢,否則是非奇異局勢;
#include
#include
#include
#include
#include
using
namespace
std;
int main()
}
hdu 2177
詳情請看這篇部落格
#include
#include
#include
#include
#include
using
namespace
std;
int main()
printf("1\n");
int bb=aa+k;
if(a-aa==b-bb&&a>aa)
printf("%d %d\n",aa,bb);
k=2.0*a/(sqrt(5.0)+1)+1;//按照狀態的小值來計算k
bb=a+k;
aa=k*(1.0+sqrt(5.0))/2;
if(a==aa&&b>bb)//a不動,只取b,(aprintf("%d %d\n",aa,bb);
k=2.0*a/(3+sqrt(5.0))+1;//按照狀態的大值來計算k
bb=a;
aa=k*(1+sqrt(5.0))/2;
if(bb-k==aa)//a不動,只取b(a>b)
printf("%d %d\n",aa,bb);
k=2.0*b/(3+sqrt(5.0))+1;
bb=b;
aa=k*(1.0+sqrt(5.0))/2;
if(bb-k==aa&&aa//b不動,只取a(a!=b防止和上一種情況重複)
printf("%d %d\n",aa,bb);
}}
威佐夫博弈 HDU1527
有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。這種情況下是頗為複雜的。我們用 ak,bk ak bk k 0,1,2,n 表示兩堆物品的數量並稱其為局勢,如果甲面對 0,0 那麼甲已經輸了,這種局勢我們稱為奇異局勢。前幾個奇異局勢是...
威佐夫博弈 hdu1527
先看題目 link 剛學習了sg函式和博弈論的一些知識,我們來分析一波,整篇文章都是自己yy的,所以極有可能偽證。先倒推 0,0 為必敗態 顯然 0,x x,0 x,x 均為必勝態 對於狀態 x,y 不妨設 x 其為必勝態當且僅當其能轉移到必敗態 x 2,y 2 其為必敗態當且僅當它沒有轉移,或僅能...
HDU1527 威佐夫石子
problem description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取...