您的位置:首页 > 其它

Pku 1067 取石子游戏

2011-03-27 10:13 267 查看
Pku 1067 取石子游戏

题目:

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

分析:

威佐夫博弈
有若干堆石子,两个人轮流从某一堆中或同时从两堆中去同样多的石子,规定每次至少去一个,多则不限,最后一个取光石子的人获胜。
假设有A、B二人,A先开始去。
如果面对的(0,0),那么A已输了,这种局势成为奇异局势,在这种局势下,A必败。
所以只要判断A所遇到的局势是否为奇异局势就可以了。
先找去前几个奇异局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)。。。
若任意给定一个局势(a,b),怎样判断?
根据公式有:ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...,n 方括号表示取整函数),观察发现其中出现了黄金分割(1+√5)/2 = 1.618..., 因此,由ak,bk组成的矩形近似为黄金矩形,令r=1.618…..,R=1/r=0.6180339887,只需要判断a==k*R,只要求出k即可,又有k=b-a。
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,k,temp,data;
double r=0.6180339887,R=1/r;
while(scanf("%d %d",&a,&b)==2)
{
if(a>b){
temp=b;
b=a;
a=temp;
}
k =b-a;
data=(int)(k*R);
if(a==data)
printf("%d/n",0);
else
printf("%d/n",1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: