威佐夫博弈(hdu 1527和2177)

2021-07-28 01:25:06 字數 1162 閱讀 6108

威佐夫博弈有關證明

如果起始狀態為奇異局勢,則為先手必敗;

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