HDU - 1564 Play a game(巴什博弈)

142 篇文章 3 订阅

New Year is Coming! 
ailyanlu is very happy today! and he is playing a chessboard game with 8600. 
The size of the chessboard is n*n. A stone is placed in a corner square. They play alternatively with 8600 having the first move. Each time, player is allowed to move the stone to an unvisited neighbor square horizontally or vertically. The one who can't make a move will lose the game. If both play perfectly, who will win the game?

Input

The input is a sequence of positive integers each in a separate line. 
The integers are between 1 and 10000, inclusive,(means 1 <= n <= 10000) indicating the size of the chessboard. The end of the input is indicated by a zero.

Output

Output the winner ("8600" or "ailyanlu") for each input line except the last zero. 
No other characters should be inserted in the output.

Sample Input

2
0

Sample Output

8600

 

 

题意:

有n*n个格子,有一块石头放在一个角落的格子,两个人轮流移石头,每次只能水平或竖直方向移动一格并且不能移动到走过的格子,最后没法移石头的一方输,给出n,输出胜利者。

 

解题思路:

可以将这道题抽象为巴什博弈,

巴什博弈(Bash Game):(引用算法讲堂-博弈论入门

 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

 

显然,如果n=m+1,1那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:每个回合时m+1个,如果n=(m+1)*r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。 

总结上面的分析得出公式:有n个物品每次最多取m个,先取完的获胜,则n%(m+1)==0时为必胜状态。

所以这道题可以转换为有n*n-1个格子(上面的n对照本题的n*n-1),每次只能走1个格子(上面的m对照本题的1),所以(n*n-1)%(1+1)==0后手必胜。

 

AC代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	while(~scanf("%d",&n)&&n)
	{
		if((n*n-1)%(1+1)) printf("8600\n");
		else printf("ailyanlu\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值