博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2177——威佐夫博弈
阅读量:4565 次
发布时间:2019-06-08

本文共 1926 字,大约阅读时间需要 6 分钟。

题目:

Description

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

Input

输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,且a<=b。a=b=0退出。

Output

输出也有若干行,如果最后你是败者,则为0,反之,输出1,并输出使你胜的你第1次取石子后剩下的两堆石子的数量x,y,x<=y。如果在任意的一堆中取走石子能胜同时在两堆中同时取走相同数量的石子也能胜,先输出取走相同数量的石子的情况.

Sample Input

1 2
5 8
4 7
2 2
0 0

Sample Output

0
1
4 7
3 5
0
1
0 0
1 2
题意:如上
分析:
   威佐夫博弈进阶,主要是当判断为必胜局面时,判断(a,b)的大小,然后根据这个从N态—>P态,输出走过之后的剩余石子数。
1 #include
2 #include
3 int main() 4 { 5 int a,b,k; 6 double eps=(1+sqrt(5.0))/2.0; 7 while(scanf("%d%d",&a,&b)==2&&(a||b)) 8 { 9 int t;10 if(a>b)11 {12 t=a;13 a=b;14 b=t;15 }16 k=b-a;17 if(int(k*eps)==a)18 printf("0\n");19 else20 {21 printf("1\n");22 for(int i=1;i<=a;i++)23 {24 int n,m;25 n=a-i;26 m=b-i;27 if(n>m)28 {29 t=n;30 n=m;31 m=t;32 }33 k=m-n;34 if(int(k*eps)==n)35 printf("%d %d\n",n,m);36 }37 for(int i=b-1;i>=0;i--)38 {39 int n,m;40 n=a;41 m=i;42 if(n>m)43 {44 t=n;45 n=m;46 m=t;47 }48 k=m-n;49 if(int(k*eps)==n)50 printf("%d %d\n",n,m);51 }52 }53 }54 return 0;55 }
View Code

 

转载于:https://www.cnblogs.com/forwin/p/4890439.html

你可能感兴趣的文章
【计算机视觉】双目测距(五)--匹配算法对比
查看>>
KMP模板
查看>>
luogu 1314 聪明的质检员
查看>>
[转载]求职者防骗必读!楼主亲身经历告诉你岗前培训多么不靠谱而且违法!
查看>>
Hibernate内存溢出分析一例
查看>>
基于Axis1.4的webservice接口开发(接口调用)
查看>>
Hive内置函数详解
查看>>
【转】MyEclipse快捷键大全
查看>>
IT职业技能图谱10--Hadoop家族技能图谱
查看>>
Java - 反射(1)
查看>>
控制台中显示执行的Sql语句
查看>>
Linux(Centos7)下搭建SVN服务器
查看>>
安卓开发的Tasks and Back Stack
查看>>
Ansi,UTF8,Unicode编码
查看>>
原子变量的性能问题
查看>>
Sybase PowerDesigner 15.0 完美版+特别文件
查看>>
快速傅立叶之二
查看>>
cetos 6.3 安装 apache+mysql+php
查看>>
js编写简单的贪吃蛇游戏
查看>>
2018/12/01 一个64位操作系统的实现 第四章 导入kernel.bin(4)
查看>>