其實就是分析一下威佐夫博弈的原理,
先設小的數量的一堆是a,
大的數量的一堆是b
如果(b-a)*(sqrt(5)+1)/2等於小的值,那麼就可以保證後手贏
那麼分析先手贏的原理便是先手拿了一次後使新的差值*(sqrt(5)+1)/2等於小的值即可
第一次拿有兩種情況:
1、如果第一次在兩堆中拿的數目相同,那麼差值是不會變的,那麼就能很容易得到拿了一次後兩堆中數量小的值
如果得到的這個小的值小於a,那麼就是符合條件的
2、如果不同,可以從1到b-1遍歷一下差值(新的差值不可能是0或b,因為這樣都能保證後手再拿一次就贏)
如果得到的新的一組資料能保證有乙個等於a或b,另乙個小於b或a就說明是滿足條件的了
還有一種特殊的情況,便是第一次就能拿走全部的,也就是0,0情況,由於上述2是從1開始遍歷的
所以不涉及這種情況,可以單獨拿出來。
#include#include#include#include#include#includeusing namespace std;
int main()
{ int a,b;
while(scanf("%d%d",&a,&b)!=-1)
{if(a==0&&b==0) break;
if(a>b) swap(a,b);
int c=b-a;
int w=(int)((sqrt(5)+1)/2*c);
if(w==a) printf("0\n");
else
{printf("1\n");
int m,n;
if(w
hdu2177威佐夫博弈
這題由於資料水1a掉了,我的 只對大的一堆進行操作也能ac,事實上應該將對小的操作情況也考慮進去,但是題目沒有給出輸出順序。思路 先用 分割乘以差值與小堆進行判段,若相等,為奇異局勢,直接輸出零。否者用二分搜尋對某一堆的操作。include includeusing namespace std co...
hdu2177 威佐夫博弈變形
有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。如果...
取 2堆 石子遊戲(威佐夫博弈 hdu2177)
t 取 2堆 石子遊戲 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2177 description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊...