码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2177 取(2堆)石子游戏 威佐夫博弈

时间:2014-08-11 18:02:32      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   2014   ar   html   amp   log   

题目来源:HDU 2177 取(2堆)石子游戏

题意:中文

思路:判断是否是必败态就不说了 做过hdu1527就知道了

现在如果不是必败态 输出下一步所有的必败态 题目要求先输出两堆都取的方案

首先 a = b 直接2堆取完

a != b 因为bi = ai+i 现在知道ak 和 bk 那么 k = bk-ak 得到k 求出 aj 和 bj 如果ak-aj == bk-bj && ak-aj > 0(aj, bj)是必败态 输出aj bj

然后是只取一堆的情况

假设a不变 求出对应的bk 如果b > bk 输出a bk

假设b不变 求出对应的ak 如果a > ak 输出ak b

注意公式 ai = i*(sqrt(5.0)+1)/2 bi = ai+i

现在如果b不变 b = i*(sqrt(5.0)+1)/2+i = i*(sqrt(5.0)+3)/2 求出i然后求出 ak

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
	int a, b;
	while(scanf("%d %d", &a, &b) && (a||b))
	{
		if(a > b)
			swap(a, b);
		//ai = i*(sqrt(5.0)+1)/2 
		//bi = ai+i
		double k = (sqrt(5.0)+1)/2;
		double k2 = (sqrt(5.0)+3)/2;
		double i = (int)(a/k);
		double i2 = (int)(a/k2);
		int a1 = i*k, b1 = a1+i;
		int a2 = (i+1)*k, b2 = a2+i+1;
		int a3 = (i2*k), b3 = a3+i2;
		int a4 = (i2+1)*k, b4 = a4+i2+1;
		if(a1 == a && b1 == b)
			puts("0");
		else if(a2 == a && b2 == b)
			puts("0");
		else
		{
			puts("1");
			if(a == b)
				printf("%d %d\n", 0, 0);
			else
			{
				int j = b-a;
				int a3 = j*k, b3 = a3+j;
				if(a-a3 == b-b3 && a-a3 > 0)
					printf("%d %d\n", a3, b3);
			}
			if(a1 == a && b1 < b)
				printf("%d %d\n", a1, b1);
			if(a2 == a && b2 < b)
				printf("%d %d\n", a2, b2);
			if(a3 < b && b3 == a)
				printf("%d %d\n", a3, b3);
			if(a4 < b && b4 == a)
				printf("%d %d\n", a4, b4);
			
		}
			
	}
	return 0;
}


 

 

HDU 2177 取(2堆)石子游戏 威佐夫博弈,布布扣,bubuko.com

HDU 2177 取(2堆)石子游戏 威佐夫博弈

标签:blog   http   io   2014   ar   html   amp   log   

原文地址:http://blog.csdn.net/u011686226/article/details/38493385

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!