1-2-K Game

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44316314/article/details/100557973

游戏规则: 有n个石子,两个人轮流取,取1,2,k个,取完胜
结论:
(1)若k%3 == 0,则n %= k + 1,若n == k,则a胜,否则忽略k转为巴什博弈。
(2)若k%3 == 1 或者 == 2,直接忽略k转为巴什博弈。
证明
情况1,将n分为n / (k + 1)堆的k+1和n%k+1的一堆。若对手取k或1,我都能使得这一回合取完k+1。若对手取2,我取2,这一轮的效果和取完k+1的效果是一样的,因为对于k-4的这一堆,对手无法使用k,那么我取要取完这一堆只要以3的倍数下降即可。所以策略为:我先尽量取完n%k+1的那一堆,对手取2时我取1,当然开始时先把余数取完。若对手不取2,我就可以消去k+1的一堆。当n%k+1的那一堆取完时,若对手还取2,我就取2。那么k-4的一堆又变成了3的倍数,用对付n%k+1的那一堆的方法解决即可。当然如果n%k+1为k,一开始直接取k即可。
情况2,k的作用与1或2的作用相同,忽略k即可。

/*
(1)若k%3 == 0,则n %= k + 1,若n == k,则a胜,否则忽略k转为巴什博弈。
(2)若k%3 == 1 或者 == 2,直接忽略k转为巴什博弈。 
*/ 

#include <cstdio>

int main()
{
	int t;
	scanf("%d",&t);
	while( t-- )
	{
		int n,k;
		scanf("%d%d",&n,&k);
		if( k % 3 )
		{
			if( n % 3 ) printf("Alice\n");
			else printf("Bob\n");
		} 
		else
		{
			n %= (k+1);
			if( n == k ) printf("Alice\n");
			else if( n % 3 ) printf("Alice\n");
			else printf("Bob\n");
		}
	}
	return 0;
 } 

巴什博弈的推广,同样若可取范围为[1,m],k,也可用同样策略。

猜你喜欢

转载自blog.csdn.net/weixin_44316314/article/details/100557973