ENimEN UVA - 11892 (简单博弈推理)

本文探讨了一种NIM博弈的变种,在该变种中加入了一个限制条件:如果先手玩家从某堆石块中取石,则后手玩家必须继续从该堆取石。文章详细分析了这一规则对游戏的影响,并给出了简洁有效的解决方案。

题目描述:在NIM博弈的基础上加一个限制条件,若先手取石块的那堆石块没有被取完,那么后手必须在这堆石块上取石头。

思路:推了一个小时才做出来,怎么说呢,结论不难推场上很多很多16级同学都退出来了,但我作为15级学姐却花费了那么长的时间才做出这道题。其实题目并不难,但是可能因为之前很少做出博弈题,所以对它有一定的畏惧吧,自己心里先怕了又怎么可能很快的做出来呢。扯远了,还是说一下结论吧,新加的这个限制条件对先手来说有很大的优势,因为如果初始的石堆中原本有奇数个1比如3 2 8 1 1 1 先手总可以先拿不为1的石堆使其只剩下一个石头,那么后手必须拿这个石头,这样原本不为1的石堆就被拿完了,剩下1 1 1 先手必胜。如果原本石堆有偶数个1比如3 2  5 6 7 1 1 ,先手总可以将某一不为一的石堆看做一,比如拿光3 2 5 6后,先手不再让石堆7只剩一个石块,而是直接全部拿走,那么轮到后手拿时,只剩下1 1,先手必胜。如果原本石堆石块数量全为1,那么结果也是很明显的,若为奇数个,先手胜,若为偶数个,后手胜。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstdlib>
#include<sstream>
#include<deque>
#include<stack>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-6;
const int maxn = 1e3 + 10;
const int mod = 10000007;
const int dx[] = {1, -1, 0, 0, -1, -1, 1, 1};
const int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
const int Dis[] = {-1, 1, -5, 5};
const double inf = 0x3f3f3f3f;
int n, m;
int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        int ans = 0;
        bool ok = false;
        for(int i = 0; i < n; ++i){
            scanf("%d", &m);
            if(m != 1) ok = true;
            else ++ans;
        }
        if(!ok){
            if(ans % 2 == 0) printf("piloop\n");
            else printf("poopi\n");
        }
        else{
            printf("poopi\n");
        }
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值