LightOJ - 1192 Left Right(博弈论-NIM博弈)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值