//HDOJ 2177 取(2堆)石子游戏 威佐夫博奕变形(Wythoff Game)
/*
题意:在Wythoff Game游戏的基础上加一个限定:只有2堆石头
如果是必胜态,则需要输出所有可以走的第一步,如果可以同时取走相同的石子的情况要先输出
思路:预处理记录奇异局势的左边位和右边位出现的是第几个奇异局势
正常的Wythoff Game规则判断胜负态
然后枚举所有可能出现的第一步走法,注意先输出可以同时取走一样石子的情况
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<cmath>
#define N 1000005
int a,b;
double t;
int fl[N];//标记第i个奇异局势的左边那位为i
int fr[N];//标记第i个奇异局势的右边那位为i
void init(){
int i;
memset(fl,-1,sizeof(fl));
memset(fr,-1,sizeof(fr));
for(i = 0; i*t+i <= N-5; ++i){
int fa = int(i*t);
fl[fa] = i;
fr[fa+i] = i;
}
}
int main(){
t=(1+sqrt(5*1.0))/2;
init();
while(scanf("%d %d",&a,&b)!=EOF){
if(a == 0 && b == 0)
break;
if(floor((b-a)*t) == a){
puts("0");
}
else{
int ta,tb,k;
puts("1");
k = b-a;
ta = k*t;
tb = ta+k;
if(a>ta && b>tb){//同时取走相同数量的石子也能胜
printf("%d %d\n",ta,tb);
}
if(fl[a]!=-1 && b > a+fl[a]){//固定a
printf("%d %d\n",a,a+fl[a]);
}
if(fr[a]!=-1 && a!=b){//固定a && 判重
printf("%d %d\n",a-fr[a],a);
}
if(fr[b]!=-1 && a > b-fr[b]){//固定b
printf("%d %d\n",b-fr[b],b);
}
}
}
return 0;
}
分享到:
相关推荐
HDOJ题目分类HDOJ题目分类HDOJ题目分类
ACM ICPC HDOJ1002
ACM ICPC HDOJ1001
hdoj1001标程
hdoj上的资源,代码有注释,很不错的哦
hdoj1004,解题代码,答案代码,欢迎下载
ACM ICPC HDOJ1008
ACM ICPC HDOJ1003
杭州电子科技大学hdoj1002,大整数相加问题
杭州电子科大HDOJ
ACM ICPC HDOJ1000
hdoj解题代码,题目为1000-1050
c语言 最短路 是hdoj上的一个最短路问题,写的很牛
一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧
codj,hdoj的源码(50-60题)
hdoj 2013 多校训练3标程+解题报告
包括简单数学 组合数学 动态规划 贪心算法 母函数 搜索算法 组合博弈论 计算几何 等等
HDOJ 源代码 包含几百道HDOJ题目源码
hdoj1005 Number Sequence, 杭州电子科技大学oj题目代码
杭电OJ(1000-1099) AC 代码