取(2堆)石子游戏

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1730    Accepted Submission(s): 1049

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
威佐夫博弈介绍http://blog.csdn.net/y990041769/article/details/21694007
如果(a - b) * gold == b则满足先手必败,其中gold = ( sqrt(5) + 1) ) / 2 = 1.618
输出时先看是否能同时取相同数量的石子,即差值保持不变
还有就是枚举差值,差值最小为1,最大为m-1,枚举满足这个差值的a和b,
如果a == n则可以拿m使它成为b,
如果a == m,这种可能不会存在,因为b就比最大的大了,
如果b == n,则可以拿m使它成为a,
如果b == m,则可以拿n,使他成为a

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cmath>
 6 using namespace std;
 7
 8 int main()
 9 {
10     int n,m;
11     while(scanf("%d%d", &n, &m) != EOF)
12     {
13         if(n == 0 && m == 0)
14             break;
15         if(n > m)
16         {
17             swap(n, m);
18         }
19         double gold = (sqrt(5) + 1)/2;
20         int c = gold * (m - n);
21         int a,b;
22         if(c == n)
23         {
24             printf("0\n");
25         }
26         else
27         {
28             printf("1\n");
29             printf("%d %d\n", c, c + m - n);
30             for(int i = 1; i <= m; i++)
31             {
32                a = i * gold;
33                if(a == c)
34                    continue;
35                b = a + i;
36                if(a == n)
37                {
38                    printf("%d %d\n", a,b);
39                }
40                else if(b == n)
41                {
42                    printf("%d %d\n",a, b);
43                }
44                else if(b == m)
45                {
46                    printf("%d %d\n", a, b);
47                }
48             }
49         }
50     }
51     return 0;
52 }

View Code

转载于:https://www.cnblogs.com/zhaopAC/p/5183246.html

HD 2177(威佐夫博弈 入门)相关推荐

  1. hdu 2177 威佐夫博弈

    题目链接:hdu 2177 威佐夫博弈水题,如果不是奇异局势需要输出走完第一步石堆的状态,先按两堆取相同石子,再按只取一堆. 可以打表解决 #include<iostream> #incl ...

  2. 博弈——威佐夫博弈(hdu1527,2177)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1527 题目描述: 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不 ...

  3. 博弈论入门之威佐夫博弈

    威佐夫博弈 威佐夫博弈是一类经典的博弈问题 有两堆石子,两个顶尖聪明的人在玩游戏,每次每个人可以从任意一堆石子中取任意多的石子或者从两堆石子中取同样多的石子,不能取得人输,分析谁会获得胜利 博弈分析 ...

  4. 杭电acm 2177 取(2堆)石子游戏(威佐夫博弈)

    取(2堆)石子游戏                       Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  5. 【小组专题二:博弈论入门综述(1)】NP状态 | SG函数 | 巴什博奕、威佐夫博弈、斐波那契博弈、Nim游戏、SJ定理

    博弈论综述[1] 前言 博弈与博弈论 博弈树 NP状态 SG函数(Sprague-Grundy) Sprague-Grundy Theorem 巴什博奕 Bash Game 威佐夫博弈 扩展威佐夫博弈 ...

  6. 威佐夫博弈算法C++

    在看本文章之前给大家说几句 如果你是先看了百度上的解释或者是其他文章,觉得很是繁琐,无法理解. 那么恭喜你,看本文会轻松很多.这里没有讲解原理之类的,只是结果.当你理解了之后,有兴趣的话就可以继续去钻 ...

  7. hdu2177——威佐夫博弈变形

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2177 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是 ...

  8. POJ1067_取石子游戏_威佐夫博弈

    /* *State: 1067 Accepted 176K 16MS C++ 435B *题目大意: * 威佐夫博弈 *解题思路: * 略. */ #include <iostream> ...

  9. 洛谷P2252 取石子游戏(威佐夫博弈)

    题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  10. 威佐夫博弈:百练OJ:1067:取石子游戏

    威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...

最新文章

  1. 概率分布,先懂这6个
  2. [Silverlight入门系列]使用MVVM模式(6):使用Behavior
  3. 伪随机交织抑制突发噪声的MATLAB仿真(采用(2,1,3)卷积码)
  4. 从此明白了卷积神经网络(CNN)
  5. vue-router详尽:编程式导航、路由重定向、动态路由匹配、路由别名、嵌套路由、命名视图
  6. account表里有什么 银行_模拟一个银行账户类Account,账户类中包括所有者、账号、余额、账户总数、存款、取款等信息。_学小易找答案...
  7. 逆向libbaiduprotect(二)
  8. Atitit.在线充值功能的设计
  9. mysql汽车租赁管理系统
  10. 转载:子网掩码以及子网划分
  11. python批量裁剪图片_python实现图片批量剪切示例
  12. 微信公众平台素材编辑与自动回复图文教程
  13. 靠这篇竟然理解了CAN协议!实战STM32
  14. Photoshop教程_ps中怎么载入图案?PS图案如何导入?
  15. iOS 可用的热更新、热修复方案
  16. 后端程序员如何写出优雅的前端试图【Thymeleaf】
  17. 【Unity VR开发】结合VRTK4.0:创建滑块
  18. 线上直播 线下分享丨这样的2019 ACOUG年会你绝对喜欢!
  19. 微生物是如何影响身体健康的?
  20. Python实现区域生长算法(regionGrow)

热门文章

  1. (转载)o(1), o(n), o(logn), o(nlogn) 时间复杂度
  2. MongoDB 通过 Java 代码 CRUD 文档
  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_1_File类的概述
  4. C语言编程-9_4 字符统计
  5. OO——电梯作业总结
  6. 实现财务自由-《富爸爸穷爸爸》读书语句摘抄
  7. [uva11806]容斥定理
  8. python学习---字符串
  9. 站在过去的肩膀上(一分钟能做什么?:不可思议的“战拖”心理学)
  10. child-selector解释