HDU 2177 取(2堆)石子游戏 (威佐夫博弈)
题目思路:威佐夫博弈:
当当前局面[a,b]为奇异局时直接输出0
否则:
1.若a==b,输出(0 0);
2.将a,b不停减一,看能否得到奇异局,若有则输出;
3.由于 ak=q*k(q为黄金分割数)具有单调性,不断改变k的值,看是否可以得到奇异局,若有则输出。
其他的话,要注意一些细节。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define MAXSIZE 100005 using namespace std; void Game(int a,int b)
{
double q=(+sqrt(5.0))/2.0;//黄金分割数
int k=b-a,n,m;
if(a==(int)(k*q))
{
printf("0\n");
return;
}
else
{
printf("1\n");
if(a==b)
{
printf("0 0\n");
}
n=a;
m=b;
while(n && m)//同时取
{
n--;
m--;
k=m-n;
if(n==(int)(k*q) && n!=m)
{
printf("%d %d\n",n,m);
break;
}
}
k=b-a;
while()//单一堆取,k不断向下取
{
n=(int)(k*q);
m=n+k;
if(n< || m<) break;
if(n<a && m<b && ((a!=n || b!=m)||(a!=m || b!=n)) && ((n==a||n==b) || (m==a || m==b)))//要求a,b能且只能改变一个数
{
printf("%d %d\n",n,m);
break;
}
k--;
}
k=b-a;
while()//同理单取一堆,k不断向上取
{
n=(int)(k*q);
m=n+k;
if(n>a || m>b) break;
if(n<=a && m<=b && ((a!=n || b!=m)||(a!=m || b!=n)) && ((n==a||n==b) || (m==a || m==b)))
{
printf("%d %d\n",n,m);
break;
}
k++;
} } } int main()
{
int a,b;
while(scanf("%d%d",&a,&b),a+b)
{
Game(a,b);
}
return ;
}
HDU 2177 取(2堆)石子游戏 (威佐夫博弈)的更多相关文章
- HDU2177:取(2堆)石子游戏(威佐夫博弈)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- HDU 2177 取(2堆)石子游戏
取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 2117 取(2堆)石子游戏【wzf博弈】
题意:威佐夫博弈原型,除了输出先手能不能胜,还要输出先手的第一手选择. 思路:预处理出1000000以内的所有奇异局势.对于每个自然数,其必然是某一个奇异局势的a或者b.故对于一个非奇异局势,必定有一 ...
- hdu 2177 取(2堆)石子游戏(威佐夫博奕)
题目链接:hdu 2177 这题不是普通的 Nim 博弈,我想它应该是另一种博弈吧,于是便推 sg 函数打了个 20*20 的表来看,为了方便看一些,我用颜色作了标记,打表代码如下: #include ...
- HDU-2177 取(2堆)石子游戏 (威佐夫博奕)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- hdu 2177 取(2堆)石子游戏 博弈论
由于要输出方案,变得复杂了.数据不是很大,首先打表,所有whthoff 的奇异局势. 然后直接判断是否为必胜局面. 如果必胜,首先判断能否直接同时相减得到.这里不需要遍历或者二分查找.由于两者同时减去 ...
- HDU 2176 取(m堆)石子游戏 —— (Nim博弈)
如果yes的话要输出所有情况,一开始觉得挺难,想了一下也没什么. 每堆的个数^一下,答案不是0就是先取者必胜,那么对必胜态显然至少存在一种可能性使得当前局势变成必败的.只要任意选取一堆,把这堆的数目变 ...
- HDU 2176 取(m堆)石子游戏 尼姆博弈
题目思路: 对于尼姆博弈我们知道:op=a[1]^a[2]--a[n],若op==0先手必败 一个简单的数学公式:若op=a^b 那么:op^b=a: 对于第i堆a[i],op^a[i]的值代表其余各 ...
随机推荐
- 推荐一个很好用的HTTP操作类
/// <summary> /// 类说明:HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提示 ...
- [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long
这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...
- js广告轮询效果
var intervalTime = 5000; var showIndex = 0; var imageLength=0; $(window).load(function () { var heig ...
- C++中#和##的特殊使用
1.用#号将输入的内容转换为字符串. 用##号将两个参数合并. #include <iostream> using namespace std; //将输入的内容转换成字符串 #defin ...
- 轻松搞定javascript日期格式化问题
Date.prototype.format = function(f){ var d = this f = f || "yyyy-MM-dd hh:mm:ss" return f. ...
- USACO 3.4 American Heritage
American Heritage Farmer John takes the heritage of his cows very seriously. He is not, however, a t ...
- python 2.7 字符串处理
python 2 字符串处理小结: 字符替换:new_str = old_str.replace(char_old, char_new)--可用于清除字符串中所有的空格 字符分割(正/反):str_n ...
- mysql数据一致性检查及修复
percona-toolkit-2.2.20-1.noarchmysql 5.6.29-logmaster:192.168.166.129slave:192.168.166.131 一.创建数据库校验 ...
- angular1 实现页面切换及tag页面
tag页面实现<div class="b_gray" style="padding-left:24px;border-bottom:1px solid #ccc&q ...
- 安卓---apk反编译
转自:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮 ...