acm威佐夫博弈(裸题代码)
来源:互联网 发布:淘宝选品数据分析 编辑:程序博客网 时间:2024/06/09 21:18
题目:
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。如果你胜,你第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 84 72 20 0
Sample Output
0101
当先手遭遇奇异局势时,必败;
当先手遭遇的不是奇异局势时他可以拿掉石子使其变为奇异局势,这样使得对手面对奇异局势,对于先手就是必胜态了,那如何变成奇异局势呢?
按题目所给,我们可以从两堆中拿走相同的石子,也可以从一堆中拿走任意石子。那就分情况讨论:
当取相同石子时,两者的差值不变,判断剩余的是否属于奇异局势即可,是输出,否不输出
当取一队石子时,在判断是否是奇异局势。有点抽象,看看代码(上代码):
#include <iostream>
#include <algorithm>#include <cmath>
#include <string.h>
using namespace std;
bool solve(int a,int 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<<endl;
continue;
}
cout<<1<<endl;
}
return 0;
}
0 0
- acm威佐夫博弈(裸题代码)
- acm 斐波那契博弈(裸题代码)
- 2017 acm icpc 上海final L 题(博弈)
- ACM博弈
- ACM博弈
- ACM 博弈
- 三个博弈-巴什博奕、威佐夫博弈、尼姆博弈。acm博弈算法笔记HDU 2149,1850,1527
- SDUT 3893 (山东省第八届ACM省赛A题) Return of the Nim 博弈nim+威佐夫
- 博弈入门---(巴什博弈,威佐夫博弈,nim博弈)
- SDUT 3893 威佐夫+nim博弈(第八届山东ACM省赛A题)
- [ACM] hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- acm杭电HDU2177取(2堆)石子游戏(威佐夫博弈)
- 2011 ACM-ICPC 成都赛区A题 Alice and Bob (博弈动规)
- 15年山东第六届acm省赛 C题 Game!(博弈)
- ACM博弈题目总结
- ACM博弈知识汇总
- acm博弈知识学习
- acm博弈模板
- 菜鸟学习Spring——SpringMVC注解版控制层重定向到控制层
- PHP中include()与require()的区别
- Asp.Net Core 连接MySQL
- POJ 2313
- 计算几何 基础知识~具体的图像解决方案前导知识
- acm威佐夫博弈(裸题代码)
- 多线程下的单例模式
- 求fibonacci数列前五十个数或者求出前50个数中的某个数的fibonacci数
- 1011: "水仙花数"问题2
- 【Java集合类源码分析】ArrayList源码分析
- 内存栅栏:软件高手的硬件观(一)
- 26. Remove Duplicates from Sorted Array
- Oracle常用的数据字典和动态视图
- spring框架介绍