首页 > 代码库 > SDUT 3004-盒子游戏(博弈)

SDUT 3004-盒子游戏(博弈)

题目链接:点击打开链接

题意: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;
}

SDUT 3004-盒子游戏(博弈)