【POJ - 2484】A Funny Game(简单对称博弈)

A Funny Game
POJ - 2484
爱丽丝和鲍勃决定玩一个有趣的游戏。在游戏开始时,他们选择 n (1 <= n < = 106)硬币在一个圆圈中,图 1 显示。移动包括移除一个或两个相邻的硬币,使所有其他硬币保持不变。必须至少取出一枚硬币。玩家交替移动与爱丽丝开始。取出最后一枚硬币的玩家获胜。(最后一个移动的玩家获胜。如果你不能移动,你就输了。
在这里插入图片描述

图1

注意:对于 n > 3,我们使用 c1,c2,。,cn 表示硬币顺时针,如果爱丽丝删除 c2,那么 c1 和 c3 不相邻!(因为 c1 和 c3 之间有一个空位。
假设爱丽丝和鲍勃在比赛中都尽了最大的
努力。
您将编写一个程序,以确定谁将最终赢得游戏。
输入
有几个测试案例。每个测试案例只有一行,其中包含正整数 n (1 <= n <= 106)。案例之间没有空白线。带有单个 0 的行终止输入。
输出
对于每个测试案例,如果爱丽丝赢了游戏,输出"爱丽丝",否则输出"鲍勃"。
示例输入
1
2
3
0
样品输出
Alice
Alice
Bob
题意描述:多实例,每组给出硬币的数量,将这些硬币围成一个圈,Alice和Bob从中取硬币,每次可以取任意1个或者是相邻的2个,Alice先取,谁最后取完所有的硬币,输出谁的名字
解题思路:先从硬币数量为1开始画,发现当硬币数量小于等于2时,Alice必胜,当硬币数大于2时,不管是奇数个还是偶数个硬币,Bob必胜,当数量为偶数时,Alice取几个,Bob只需要取和Alice取的相同数量的硬币对称地方的硬币即可,当为奇数时,不管Alice怎么取,Bob只需将剩下的硬币变成可以对称的就行了。

#include<stdio.h>
int main(void)
{
    
    
	int n;
	while(~scanf("%d",&n))
	{
    
    
		if(n==0)
			break;
		else if(n>2)
			printf("Bob\n");
		else
			printf("Alice\n");
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/m0_58245389/article/details/120257293