博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ACM] hdu 2177 取(2堆)石子游戏(威佐夫博弈)
阅读量:6820 次
发布时间:2019-06-26

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

 

Problem 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
 

 

Author

 

Zhousc
 

 

Source

 

 

解题思路:

(a,b)奇异态先手必败,非奇异态先手必胜。先判断初始状态,如果为奇异态,则先手必败,否则,要输出先手第一次取石子后,两堆石子各剩下多少个,即由非奇异态转到奇异态。 做法是枚举所有的状态。比如测试数据中的 初始 5  8 是非奇异态,

则先手第一次取石子两堆可能剩下的状态有

一。两堆取相同的石子数

4  7

3  6

2  5

1  4

0   3

二。在第一堆里取

4 8

3 8

2 8

1 8

0 8

三。在第二堆里取

5 7

5 6

5 5

5 4

5 3

5 2

5 1

5 0

代码:

#include 
#include
#include
#include
using namespace std;bool solve(int a,int b)//判断(a,b)是否为奇异态{ double x=(1+sqrt(5))/2; int n=b-a; if(a==(int)(x*n)) return 1; return 0;}int main(){ int a,b; while(cin>>a>>b&&(a||b)) { if(solve(a,b)) { cout<<0<
m) swap(n,m); if(solve(n,m)) cout<
<<" "<
<

 

转载于:https://www.cnblogs.com/sr1993/p/3697920.html

你可能感兴趣的文章
scala中Ordered和Ordering的区别
查看>>
文字排版中的设计四原则(三)
查看>>
我的友情链接
查看>>
JavaSE 学习参考:常量
查看>>
netapp 2个控制器spare盘分配
查看>>
我的友情链接
查看>>
华为AR2220E-S 设置限制上网时间
查看>>
实现cell的点击高亮
查看>>
如何用腾讯云打造一款微视频APP
查看>>
linux内核中的hook函数详解
查看>>
调用手机GPS实现当前位置定位并展现百度地图上
查看>>
Dota2卡牌游戏《Artifact》登陆Windows/Mac/Linux
查看>>
ruby向数据库用语句插入数据
查看>>
个人--IT业的职业细分
查看>>
“赋能开发者”高峰论坛暨葡萄城联合龙头企业共建模板库正式启动
查看>>
CentOS内核参数优化参考
查看>>
2017年大数据分析领域的六大发展趋势
查看>>
删除Jenkins的构建次数(基于Jmeter的Maven项目)
查看>>
springboot中配置文件配置各种随机数
查看>>
scala----函数和构造函数区别
查看>>