LightOJ - 1192 Left Right(博弈论-NIM博弈)
vjudge:vjudge
judge:LightOJ - 1192
Time limit 2000 ms
Memory limit 32768 kB
OS Linux
Source Problem Setter: Jane Alam Jan
描述
Two players, Alice and Bob are playing a strange game in a 1 x n board. The cells are numbered from 0 to n-1, where the left most cell is marked as cell 0. Each cell can contain at most one piece.
vjudge:vjudge
judge:LightOJ - 1192
Input
vjudge:vjudge
judge:LightOJ - 1192
Output
vjudge:vjudge
judge:LightOJ - 1192
Sample Input
2
2
0 3 7 9
2
1 3 7 9
Sample Output
Case 1: Alice
Case 2: Bob
题意
两个玩家,爱丽丝和鲍勃在1×N的棋盘上玩一个奇怪的游戏。单元格编号从0到N-1,其中最左边的单元格标记为单元格0。每个单元最多可包含一个单元。
图1:示例
单元格有两种,灰色和白色。爱丽丝移动灰色部分,鲍勃移动白色部分。各部分交替出现,也就是说,最左边的部分是灰色的,接下来是白色的,接下来是灰色的,然后又是白色的,依此类推。总有相同数量的黑色和灰色碎片。爱丽丝只能向右移动棋子。鲍勃只能向左移动棋子。
在每次移动中,玩家选择一个棋子并移动该棋子,要么向左(bob)移动,要么向右(alice)移动任意数量的单元格(至少1个),但是,它既不能跳过其他棋子,也不能移出棋盘。队员们轮流开始。
例如,如果爱丽丝决定移动最左边的灰色部分,这两个移动对她来说是可用的。
图2:将灰色部分向右移动一个单元格
图3:将灰色部分向右移动两个单元格
爱丽丝先走。当有人无法移动时,游戏结束,游戏失败。你可以假设,这两种策略都是最佳的(也就是说,如果可以应用一种策略来确保某人获胜,他/她将始终使用该策略)。
因为灰色只能向右,白色只能向左,所以灰色和白色中间的部分就可以看作是一堆堆的石子,两人轮流取石子。而白色和灰色中间的部分无效,因为当白色往右边移动时,灰色也可以往右边移动相同的步数,对必胜策略没有影响;同理如果灰色往左移动,那么白色也可以往左移动。
NIM详细讲解请移步:Nim博弈论详解
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#define lowbit(a) ((a)&-(a))
#define maxn 100005
#define eps 0.000000001
using namespace std;
typedef long long ll;
int main(){
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int T;
cin >> T;
for(int ca = 1; ca <= T; ca++){
int n;
cin >> n;
int a[205];
for(int i = 0; i < 2 * n; i++){
cin >> a[i];
}
int ans = 0;
for(int i = 1; i < 2 * n; i += 2){
ans ^= (a[i] - a[i - 1] - 1);
}
if(!ans) printf("Case %d: Bob\n", ca);
else printf("Case %d: Alice\n", ca);
}
return 0;
}