首页 > 代码库 > HDU-1527-取石子游戏
HDU-1527-取石子游戏
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1527
威佐夫博奕(Wythoff Game):有两堆各若干个物品,
两个人轮流从某一堆或同时从两堆中取同样多的物品,
规定每次至少取一个,多者不限,最后取光者得胜。
性质:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜
;反之,则后拿者取胜。
判断是否为奇异局势:任给一个局势(a,b), (下面用到的a是两者中较小的数)
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,可以先求出j=[a(√5-1)/2],若a=[
j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1
+ j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异
局势。
代码
#include<stdio.h>
#include<math.h>
int main(void)
{
int a,b,k,ak;
while(scanf("%d%d",&a,&b)==2)
{
if(a>b)
a=a^b^(b=a);
k=b-a;
ak=k*(sqrt(5)+1)/2;
if(a==ak)
printf("0\n");
else
printf("1\n");
}
return 0;
}
HDU-1527-取石子游戏