HDU2177:取(2堆)石子游戏(威佐夫博弈)
5 8
4 7
2 2
0 0
1
4 7
3 5
0
1
0 0
1 2
明显的威佐夫博弈题
其实这道题的关键就在于对威佐夫博弈的理解
首先我们来看这道题所涉及的一部分威佐夫博弈的主要知识点
0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。
可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,
由此我们可以进行一次奇异状态的打表,再枚举所有的状态即可
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#include <algorithm>
using namespace std; int ans[1000005][2],len;
int hash[2000005];
map<int,map<int,int> > vis; int main()
{
int a,b,i,j,pos;
memset(hash,0,sizeof(hash));
hash[0] = 1;
double k = (sqrt(5)-1.0)/2.0;
ans[0][0] = ans[0][1] = 0;
len = 1;
for(i = 1; i<=1000000; i++)
{
a = i;
j = a*k;
if(a != (int)(j*(1+k)))
j++;
b = a+j;
if(b>1000000)
break;
if(hash[a])
continue;
ans[len][0] = a;
ans[len][1] = b;
hash[a] = hash[b] = 1;
len++;
}
while(~scanf("%d%d",&a,&b),a+b)
{
vis.clear();
if(a>b)
swap(a,b);
j = a*k;
if(a != (int)(j*(1+k)))
j++;
if(a+j == b)
printf("0\n");
else
{
printf("1\n");
if(a == b)//相同可以取完
{
printf("0 0\n");
vis[0][0] = 1;
}
else//我们知道b = a+k,并且可以发现,在奇异状态之中,a,b的差正好就是其位于数组的下标,由此我们可以突出这个状态
{
int k = b-a;
if(b-ans[k][1]==a-ans[k][0]&&b-ans[k][1]>0&&a-ans[k][0]>0)
printf("%d %d\n",ans[k][0],ans[k][1]);
vis[ans[k][0]][ans[k][1]]=1;
}
for(i = 0; i<len; i++)//剩下的就是简单的枚举了,由于奇异状态中,后面的是大的,所以当a在后面出现的话就枚举完了
{
if(a == ans[i][0] && !vis[ans[i][0]][ans[i][1]])
printf("%d %d\n",ans[i][0],ans[i][1]);
if(a == ans[i][1] && !vis[ans[i][0]][ans[i][1]])
{
printf("%d %d\n",ans[i][0],ans[i][1]);
break;
}
}
}
} return 0;
}
HDU2177:取(2堆)石子游戏(威佐夫博弈)的更多相关文章
- HDU-2177 取(2堆)石子游戏 (威佐夫博奕)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- HDU2177取(2堆)石子游戏---(威佐夫博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=2177 取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) M ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- nim3取石子游戏 (威佐夫博弈)
http://www.cnblogs.com/jackge/archive/2013/04/22/3034968.html 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有 ...
- HDU 1527 取石子游戏(威佐夫博弈)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- 洛谷P2252 取石子游戏(威佐夫博弈)
题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- hdu1527取石子游戏(威佐夫博弈)
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- P2252 取石子游戏 威佐夫博弈
$ \color{#0066ff}{ 题目描述 }$ 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆 ...
- POJ 1067 取石子游戏 威佐夫博弈
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...
随机推荐
- 213. House Robber II
题目: Note: This is an extension of House Robber. After robbing those houses on that street, the thief ...
- Civil3D二次开发 启动Civil3D异常
用Com方式启动Civil3D时,经常会在第一次启动时出现各种异常. 1. RPC_E_CALL_REJECTED 0x80010001 被呼叫方拒绝接收呼叫 解决方案:外部程序通过COM启动Auto ...
- TSharding:用于蘑菇街交易平台的分库分表组件
tsharding TSharding is the simple sharding component used in mogujie trade platform. 分库分表业界方案 分库分表TS ...
- nginx负载均衡 - session失效
最近迷上了Nginx,真实麻雀虽小,五脏俱全..功能实在强大.. nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以 ...
- PHP 日期计算函数【差异天数】
function count_days($a,$b){ $a_dt=getdate($a); $b_dt=getdate($b); $a_new=mktime(12,0,0,$a_dt['mon'], ...
- Unable to open c
1. Unable to open c:\Cadence\PSD_14.2\tools\capture\allegro.cfg for reading. Please correct the abov ...
- minitools
1.android 2.linux 3.luoji 4.windows CE ----
- It is indirectly referenced from required .class files
配置eclipse的导入包,有些包引用的位置不正确
- android 组件设置屏幕大小
WindowManager wManager = getWindowManager(); DisplayMetrics metrics = new DisplayMetrics(); wManager ...
- 选择select框跳出信息
<html > <body > <select type="select" name=s1 onChange=alert("你选择了&quo ...