2020 JUSTCTF 算法题解

本文详细解析了JustCTF中的小汪钓鱼问题,通过模拟游戏规则并使用C++编程实现,探讨如何帮助小汪在有限时间内预测比赛结果。最终目标是找出最后赢家的牌堆序列。

JUSTCTF 算法题解

小汪钓鱼

这题还是挺有意思的,谁知道网上还有源码,这波大意了啊,没有验题(逃)!

出题人背锅o( ̄┰ ̄*)ゞ

题目概述

你听说过小猫钓鱼吗?那你一定能会做小汪钓鱼!

两个人一开始各有一摞牌,然后轮流着拿自己那一摞的最顶上的牌,一张接着一张放到公共的牌池里,如果遇到之前有和这一张上的数字相同的牌,就把这两张牌包括起来的所有牌都放到自己牌堆的底部(拿取的顺序为从刚刚放的那张牌开始,一张一张放到自己牌堆的底部,直到拿掉以前那张数字相同的为止)。

小猫在和小汪正在玩这个游戏,可是随着牌的数量增多,游戏进行的时间也会越来越长,心急的小汪等不了如此长的时间,于是想想你求助,尽快知道结果,当有一方手里没牌时,游戏结束。

小汪一开始手中的牌为:6 5 4 3 2 1 8 7 5 2 3 5 6 9 8 2 1 4 6 2 7 8 8 6 5

小猫一开始手中的牌为:1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 2 1 5 6 3 2 1 1

小汪先出牌。

你能帮帮他吗?flag为最后赢家牌堆中的所有牌,请从牌堆顶开始往牌堆底列。

题目分析

  • 很明显只要模拟题目所给的过程就行了,也没有什么简单的解法。
  • 你可以选择和另一个人使用纸片模拟,经过计算,只要两千多步就能模拟完整个过程。也可以选择使用程序计算出来,一下给出使用c++编写计算程序的方法,详细的步骤都以注释的方式给明了。

标程

#include<stack>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;

int main() {
   
   
    //使用队列来模拟一开始两个人手中的牌
    queue<int> dog, cat;
    //n代表输入的牌数
    //这边只需要数一下就行了
    int n, op;
    cin >> n;
    for(int i = 0; i < n; i ++ ) {
   
   
        cin >> op;
        dog.push(op);
    }
    for(int i = 0; i < n; i ++ ) {
   
   
        cin >> op;
        cat.push(op);
    }
    //使用idx来判断当前是谁的回合
    int idx = 1;
    //使用栈来模拟牌堆
    stack<int> stk;
    //使用st来记录是否牌堆中有相同的牌
    bool st[10];
    memset(st, false, sizeof st)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值