SDUT 3004-盒子游戏(博弈)

本文介绍了一个两人轮流操作的游戏,分析了其胜负策略。游戏规则包括双方轮流从两个不同数量的球堆中移动球,目标是避免自己无法操作的局面。文章通过代码展示了如何判断初始状态下哪一方有必胜策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接

题意:2人博弈问题。

有两个相同的盒子,其中一个装了 n 个球,另一个装了一个球。 Alice 和 Bob 发明了一个游戏,规则如下:

Alice 和 Bob 轮流操作, Alice 先操作。每次操作时,游戏者先看看哪个盒子里的球的数目比较少, 然后清空这个盒子(盒子里的球直接扔掉),然后把另一个盒子里的球拿一些到这个盒子中,使得两个盒子都至少有一个球。如果一个游戏者无法进行操作,他(她)就输了。

有一个地方比较坑的是当两堆物品相同的时候可以取任意一堆而不是直接输掉。可见 (1,1)是终态。推一下可以发现当n 为 2^m-1 的时候Bob必胜,反正Alice必胜。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define maxn 10100
#define _ll __int64
#define ll long long
#define INF 0x3f3f3f3f
#define Mod 1000000007
#define pp pair<int,int>
#define ull unsigned long long
using namespace std;
int n;
int main()
{
	while(scanf("%d",&n)!=EOF&&n)
	{
		++n;
		while(!(n&1))
			n>>=1;
		if(n==1)puts("Bob");
		else puts("Alice");
	}
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值