简单博弈(hdu 2188 && 4764 && 2149 && 3863 && 3951 && 1564)

11 篇文章 0 订阅

2188题目:点击打开链接

赤裸裸的巴什博弈。

#include <stdio.h>

int main (void)
{
	int c;
	scanf("%d", &c);
	while(c --)
	{
		int n, m;
		scanf("%d %d", &n, &m);
		if(n % (m + 1) == 0)
		{
			printf("Rabbit\n");
		}
		else
			printf("Grass\n");
	}
	return 0;
}


4764题目:点击打开链接

两个人轮流写数字,谁先超过给定的数n谁输。

题目说1 <= Y - X <= k,也就是 1 + X <= Y <= k + X,因为是累加,所以可以看成X和Y的范围是 1<= Y, X <= k,所以这样就转化为谁取到最后谁输的巴什博弈。仔细考虑一下,巴什博弈是每次累加着取,而这题是在对方写的数字的基础上取,其实两种情况是一样的。

胜的一方必须是拿到N-1这个数  那么输的一方肯定是在 N-k-1 ~ N-2 这些数中取  那么赢的一方必然取到了N-k-2这个数

所以一次递归推算 先手取到这些特殊数的必赢  这些数为 N-1、N-1-(k+1)、N-1-2(k+1) ......

所以得如果N-1 能够整除 k+1 则后手赢  否则先手赢

当然得注意N=1 的情况  和k>=N 的情况

#include <stdio.h>

int main (void)
{
	int n, k;
	while(scanf("%d %d", &n, &k) != EOF)
	{
		if(n == 0 && k == 0)
			break;
		if((n - 1) % (k + 1) != 0)
			printf("Tang\n");//先手赢
		else
			printf("Jiang\n");		
	}
	return 0;
}


2149题目:点击打开链接

这题就是巴什博弈的一个扩展。

#include <stdio.h>

int main (void)
{
	int m, n;
	while(scanf("%d %d", &m, &n) != EOF)
	{
		int i;
		if(m % (n + 1) == 0)//先手必输 
			printf("none");
		else
		{
			int f = 0;
			if(n < m)//只要留给对方(n +1)的倍数个就能赢,所以将除以(n + 1)的余数个都拿走 
				printf("%d", m % (n + 1));
			if(n >= m)
			{
				for(i = m; i <= n; i ++)
				{
					if(f == 0)
					{
						f = 1;
						printf("%d", i);
					}
					else
						printf(" %d", i);
				}
			}
		}
		printf("\n");
	}
	return 0;
}

3863题目: 点击打开链接

这题……………………特别不想吐槽………………题目意思就是先手从左到右连接蓝点,后手从上到下连接红点,轮流进行,谁先对面谁赢。想了半天想不太出来,结果居然是是先手一定会胜,因为先手后手完成一样的任务,先手比后手先走一步,必定是赢的。

#include <stdio.h>

int main (void)
{
	int n;
	while(scanf("%d", &n) != EOF)
	{
		if(n == -1)
			break;
		else
			printf("I bet on Oregon Maple~\n");
	}
	return 0;
}

3951题目: 点击打开链接

环形博弈,把硬币围成一个圈,然后每次可以取一个或者连续的2到k个,这题挺像NYOJ上取石子(七)的,我刚开始没有写m >= k的情况所以WA了,如果每次最多只能去一个,那么就根据硬币个数的奇偶性来判断,如果给的k大于1,那么后手一定胜,因为后手可以根据先手所取的,将剩下的硬币平分,就一颗保证一定赢。

#include <stdio.h>

int main (void)
{
	int t, c = 0;
	scanf("%d", &t);
	while(t --)
	{
		c ++;
		int n, m;
		scanf("%d %d", &n, &m);
		printf("Case %d: ", c);
		if(m >= n)
		{//这里别忘 
			printf("first\n");
		}
		else if(m == 1)
		{
			if(n % 2 == 0)
				printf("second\n");
			else
				printf("first\n");
		}
		else
			printf("second\n");
	}
	return 0;
}


1564题目:点击打开链接

直接判断奇偶性,我做的时候就抱着试一试的心态交的代码……没想到就过了……

#include <stdio.h>

int main (void)
{
	int n;
	while(scanf("%d", &n) != EOF)
	{
		if(n == 0)
			break;
		if(n % 2 == 0)
			printf("8600\n");
		else
			printf("ailyanlu\n");
	}
	return 0;
}


总结一下,博弈太差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值