20190803

本文介绍了一个基于跳棋的游戏策略分析,探讨了两名玩家在n*20棋盘上的对弈,详细解释了游戏规则和胜利条件,通过示例展示了如何判断胜负,并提供了一段C++代码实现。

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

题目描述
AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘,以及棋盘上有若干个棋子,问谁赢?akn先手!

游戏规则是这样的:

对于一个棋子,能将它向右移动一格,如果右边有棋子,则向右跳到第一个空格,如果右边没有空格,则不能移动这个棋子,如果所有棋子都不能移动,那么将输掉这场比赛。

输入格式
第一行一个T,表示T组数据

每组数据第一行n,表示n*20的棋盘

接下来n行每行第一个数m表示第i行有m个棋子

随后跟着m个数pj表示第i行的棋子布局

输出格式
如果AKN能赢,则输出”YES”,否则输出”NO”

输入输出样例
输入 #1 复制
2
1
2 19 20
2
1 19
1 18
输出 #1 复制
NO
YES
说明/提示
10%的数据T≤1,n≤1

另外10%的数据m≤1

100%的数据T≤100,n≤1000,m≤20,1≤pj≤20

By:Mul2016

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int SG[30],a[30],fz[1000];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);
    int t,n;cin>>t;int a[30],cnt[30];
    while(t--)
    {
        cin>>n;
        int ans=0;
        for(int i=1;i<=n;++i)
        {
            int len;
            memset(cnt,0,sizeof cnt);
            cin>>len;
            for(int i=1;i<=len;++i)
                cin>>a[i],cnt[a[i]]++;
            int tot=0,i=20,fg=0;
            while(cnt[i])--i;
            for(;i;--i)
            {
                if(!cnt[i])ans^=(fg?tot:0),fg^=1,tot=0;
                else ++tot;
            }
            ans^=(fg?tot:0);
        }
        cout<<(ans?"YES":"NO")<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值