iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >15. 卡牌游戏
  • 633
分享到

15. 卡牌游戏

数据结构算法c++ 2023-09-05 20:09:47 633人浏览 薄情痞子
摘要

目录 题目 思路 C++整体代码(含详细注释) 题目 Description 小张在玩一种卡牌游戏,牌组由张牌组成,其中张上写有数字各一张,其余张上全部是数字。 现在牌组经过随机打乱后,小张拿走其中张牌作为手牌,其余张牌作为牌堆。 小

目录

题目

思路

C++整体代码(含详细注释)


题目

Description
小张在玩一种卡牌游戏,牌组由张牌组成,其中张上写有数字各一张,其余张上全部是数字。
现在牌组经过随机打乱后,小张拿走其中张牌作为手牌,其余张牌作为牌堆。
小张想经过若干次如下操作使得牌堆自顶向下的牌依次为。
每一次操作,小张选择任意一张手牌放到牌堆底,并将牌堆顶的牌放入手牌。
他想知道最少进行几次操作,使得牌堆自顶向下的牌依次为。
Input
第一行一个数。
第二行个数,表示小张手中的牌。
第三行个数,表示牌堆,数组从左向右的顺序表示牌堆自顶向下的顺序。
Output
一个整数,表示最少执行的操作数

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 3↵
  2. 0 2 0↵
  3. 3 0 1↵
以文本方式显示
  1. 2↵
1秒64M0
测试用例 2以文本方式显示
  1. 3↵
  2. 0 2 0↵
  3. 1 0 3↵
以文本方式显示
  1. 4↵
1秒64M0

思路

手上的牌不重要,重要的是牌堆里非0数字的位置,有三种情况:

1)牌堆最后存在1开头连续的数并且其他的数字均符合位置条件

2)牌堆最后存在1开头连续的数但其他的数字不均符合位置条件

3)牌堆最后不存在1开头连续的数

操作方法

  • 情况1的操作方式一目了然,直接把1前面的数字挤掉的同时在牌堆尾部添加相应的数字。
    结果=1的位置-牌堆顶部位置
  • 情况2和情况3虽然描述不同,但操作方法是一样的。
    结果=牌堆所有数字位置合理时需要操作的最大值+牌堆数字个数

具体步骤

定义一个函数hasSequentialSegment用于判断牌堆底部是否有以1开头的连续递增子序列。它通过遍历牌堆底部,找到1的位置,然后判断后续的数字是否连续递增,如果是则返回true,否则返回false。

// 判断牌堆底部是否有1开头的连续的子序列bool hasSequentialSegment(const vector& pile) {    int k = 0;    int num = 2;    for (int i = 1; i < pile.size(); i++) {//找到1的位置        if (pile[i] == 1) {            k = i+1;            break;        }}    while (pile[k] == num) {//判断是否连续        num++;        k++;    }    //如果子序列从1开始连续递增直至牌堆底部,则返回true    if (k == pile.size()) return true;    return false;//没有则返回false}

定义一个函数calculateResult用于计算最少执行的操作数。首先判断牌堆底部是否有以1开头的连续递增子序列,如果有,再判断牌堆其他数字的位置是否满足条件。如果满足条件(情况一),则结果为1的位置减去牌堆顶部位置。如果不满足条件(情况二、三),则需要计算使牌堆所有数字位置合理时需要操作的最大值,即遍历牌堆中的数字,找到使数字位置合理的最大差值。最后,结果为牌堆所有数字位置合理时需要操作的最大值加上牌堆的数字个数。

// 计算最少执行的操作数int calculateResult(const vector& pile) {    int result = 0;    int maxDiff = 0;    // 如果牌堆底部中包含1开头的连续的递增子序列    if (hasSequentialSegment(pile)) {        int k = 0;        int target = 0;        int flag = 1;//用于标记递增子序列以外的数字位置是否合理    //找到1的位置        for (int i = 1; i <= pile.size() - 1; i++) {            if (pile[i] == 1) {                k = i;                break;            }        }        target = pile.size() - k;//标记1开头连续子序列的最后一个数字                    for (int j = 1; j < k; j++) {//遍历1前面的数字,判断这个数字当前的位置是否合理            if (pile[j] > target&& j + 1 > pile[j] - target) {                 flag = 0;//如果不合理,                 break;                }            }        //计算操作次数,分为两种情况        // 第一种情况:牌堆底部有1开头连续递增子序列且牌堆其他数字满足位置条件        if (flag == 1) {            result = k - 1;//结果=1的位置-牌堆顶部位置            return result;        }    }        //第二种情况:①牌堆底部没有1开头的递增子序列②牌堆底部有1开头的连续子序列但牌堆其他数字不满足位置条件        // 计算使牌堆所有数字位置合理时需要操作的最大值       for (int i = 1; i <= pile.size()-1; i++) {         if (i >= pile[i] && pile[i] != 0) {            maxDiff = max(maxDiff, i - pile[i] + 1);          }        }       result = maxDiff + pile.size()-1;//结果=牌堆所有数字位置合理时需要操作的最大值+牌堆的数字个数       return result;}

在主函数中,首先读入输入的牌堆大小n,然后分别读入手牌和牌堆的数字。调用calculateResult函数计算最少执行的操作数,并输出结果。

int main() {    int n;    cin >> n;    vector hand(n + 1), pile(n + 1);    for (int i = 1; i <= n; i++) {        cin >> hand[i];    }    for (int i = 1; i <= n; i++) {        cin >> pile[i];    }    int result = calculateResult( pile);    cout << result << endl;    return 0;}

c++整体代码(含详细注释)

#include #include #include using namespace std;// 判断牌堆底部是否有1开头的连续的子序列bool hasSequentialSegment(const vector& pile) {    int k = 0;    int num = 2;    for (int i = 1; i < pile.size(); i++) {//找到1的位置        if (pile[i] == 1) {            k = i+1;            break;        }}    while (pile[k] == num) {//判断是否连续        num++;        k++;    }    //如果子序列从1开始连续递增直至牌堆底部,则返回true    if (k == pile.size()) return true;    return false;//没有则返回false}// 计算最少执行的操作数int calculateResult(const vector& pile) {    int result = 0;    int maxDiff = 0;    // 如果牌堆底部中包含1开头的连续的递增子序列    if (hasSequentialSegment(pile)) {        int k = 0;        int target = 0;        int flag = 1;//用于标记递增子序列以外的数字位置是否合理    //找到1的位置        for (int i = 1; i <= pile.size() - 1; i++) {            if (pile[i] == 1) {                k = i;                break;            }        }        target = pile.size() - k;//标记1开头连续子序列的最后一个数字                    for (int j = 1; j < k; j++) {//遍历1前面的数字,判断这个数字当前的位置是否合理            if (pile[j] > target&& j + 1 > pile[j] - target) {                 flag = 0;//如果不合理,                 break;                }            }        //计算操作次数,分为两种情况        // 第一种情况:牌堆底部有1开头连续递增子序列且牌堆其他数字满足位置条件        if (flag == 1) {            result = k - 1;//结果=1的位置-牌堆顶部位置            return result;        }    }        //第二种情况:①牌堆底部没有1开头的递增子序列②牌堆底部有1开头的连续子序列但牌堆其他数字不满足位置条件        // 计算使牌堆所有数字位置合理时需要操作的最大值       for (int i = 1; i <= pile.size()-1; i++) {         if (i >= pile[i] && pile[i] != 0) {            maxDiff = max(maxDiff, i - pile[i] + 1);          }        }       result = maxDiff + pile.size()-1;//结果=牌堆所有数字位置合理时需要操作的最大值+牌堆的数字个数       return result;}int main() {    int n;    cin >> n;    vector hand(n + 1), pile(n + 1);    for (int i = 1; i <= n; i++) {        cin >> hand[i];    }    for (int i = 1; i <= n; i++) {        cin >> pile[i];    }    int result = calculateResult( pile);    cout << result << endl;    return 0;}

来源地址:https://blog.csdn.net/m0_74200772/article/details/132563546

--结束END--

本文标题: 15. 卡牌游戏

本文链接: https://www.lsjlt.com/news/395967.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 15. 卡牌游戏
    目录 题目 思路 C++整体代码(含详细注释) 题目 Description 小张在玩一种卡牌游戏,牌组由张牌组成,其中张上写有数字各一张,其余张上全部是数字。 现在牌组经过随机打乱后,小张拿走其中张牌作为手牌,其余张牌作为牌堆。 小...
    99+
    2023-09-05
    数据结构 算法 c++
  • 6.2 扑克牌游戏
    本关任务:编写一个将牌排序的小程序。 第1关 按顺序输出新牌 def start(): """初始顺序,返回元素为字符串的列表""" ########## Begin ########## list = [] for...
    99+
    2023-10-20
    python 学习
  • 运营卡牌游戏如何选择日本服务器
    选择日本服务器进行卡牌游戏的运营需要考虑以下几点: 目标玩家群体:日本拥有庞大的游戏玩家群体,特别是对卡牌游戏有较高兴趣的玩家。选...
    99+
    2024-04-09
    日本服务器 服务器
  • 纸牌回归 Wind10重现经典纸牌游戏
    尽管纸牌,微软还是选择在Windows 8中删除了这些游戏,尽管消费者可以在Windows应用商店当中下载或者购买这些游戏的最新版本。但是用户从开始>程序>附件>游戏当中找到经典Windows游戏更加怀...
    99+
    2023-06-14
    纸牌 Win10 游戏 经典
  • 15. python从入门到精通——Pygame游戏编程
    目录 游戏的原理 安装Pygame Pygame常用模块 Pygame的基本使用      实例:制作一个跳跃的小球游戏,如果碰到窗口边缘会改变小球移动方向 实现步骤:  运行效果: 小球图片:      python代码: 开发Flapp...
    99+
    2023-09-16
    pygame 游戏 python
  • html5实现记忆翻牌游戏
    本篇内容主要讲解“html5实现记忆翻牌游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5实现记忆翻牌游戏”吧!翻开的2张牌如果配对就会消除,否则2张...
    99+
    2024-04-02
  • C语言扑克牌游戏示例
    目录一、 设计目的二、 设计内容与要求三、 设计思路四、 实现过程五、 结论与改进一、 设计目的 扑克牌是我们从小玩到大的纸牌类小游戏,我们有各种玩法跟不同的规则。我之所以选择的这个...
    99+
    2024-04-02
  • js实现简单翻牌小游戏
    本文实例为大家分享了js实现简单翻牌小游戏的具体代码,供大家参考,具体内容如下 1.简介 非常简单的一个网络消消乐翻牌小游戏的实现,代码量较少,不过遇到的bug和自行开发的步骤十分有...
    99+
    2024-04-02
  • C语言实战之纸牌游戏
    目录1. 基本要求2. 运行界面3. 代码解释 1. 基本要求 一副没有花牌(J、Q、K、A、大小王)的扑克牌,两个人进行纸牌游戏,其中一个人为用户,另一个人为计算机; ...
    99+
    2024-04-02
  • 效果最接近《羊了个羊》(卡牌堆叠游戏)的开源代码
    ⭐零、教程概述 效果最接近《羊了个羊》(卡牌堆叠游戏)的开源代码,有数据库和关卡。 我写的程序是指 卡牌堆叠游戏 ,效果与羊了个羊一致。本教程有两个版本 PHP 使用 PHP + H5 + CSS +...
    99+
    2023-09-06
    游戏 开源 c++ html5 php
  • 显卡云服务器挂游戏会卡吗
    首先,玩家可以考虑使用专门的显卡云服务器。这种服务器通常使用云端存储来存储游戏数据,包括游戏内的设置、角色和地图等。这样一来,玩家只需要连接到一个可用的云端服务器,就可以使用所有这些游戏设置和功能了。 此外,玩家还可以使用其他云端存储服务...
    99+
    2023-10-27
    显卡 服务器 游戏
  • win10玩游戏卡顿怎么办
    这篇“win10玩游戏卡顿怎么办”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10玩游戏卡顿怎么办”文章吧。win10...
    99+
    2023-07-01
  • 云服务器运行游戏卡
    云服务器运行游戏卡可能会导致您在游戏中遇到一些问题,例如卡顿、游戏崩溃或者服务器故障等。以下是可能导致游戏卡顿的几个常见原因: 网络连接问题:如果您使用的是电信或联通的云服务器,可能会因为网络连接问题而导致游戏卡顿。您需要检查您的网络连...
    99+
    2023-10-26
    游戏卡 服务器
  • 云服务器玩游戏卡吗
    云服务器玩游戏并不会出现卡顿的问题,但是可能会有一些延迟和掉线的情况。如果你想测试云服务器的性能,可以尝试以下几个方面: 关闭游戏窗口。游戏窗口可能会消耗一些资源并导致卡顿。 调整游戏帧数。确保游戏帧数在一定范围内,尽量避免游戏过热或过...
    99+
    2023-10-26
    游戏卡 服务器
  • win101909玩游戏卡如何解决
    本篇内容主要讲解“win101909玩游戏卡如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win101909玩游戏卡如何解决”吧!一、 驱动不一定要最新版,往往新驱动不一定适合...
    99+
    2023-07-01
  • 棋牌游戏服务器如何选择
    选择棋牌游戏服务器时,需要考虑以下几个方面: 稳定性:游戏服务器必须保持稳定运行,避免出现频繁的断线或卡顿现象,影响玩家体验。 ...
    99+
    2024-04-29
    服务器
  • 基于WPF实现经典纸牌游戏
    目录1 纸牌类2 布局3 初始化4 事件点击牌堆拖动牌的去留1 纸牌类 之所以产生这个无聊至极的念头,是因为发现Unicode中竟然有这种字符。。。 这就意味着不用任何资源就可以实...
    99+
    2023-02-27
    WPF实现纸牌游戏 WPF纸牌游戏 WPF游戏
  • Win8.1版足球竞技游戏 FIFA 15:UT免费下载
    FIFA 15的概念   EA发售的足球模拟游戏《FIFA 15》将给带给玩家更高层次的视觉享受。游戏使用了《UFC》所使用的EA的Ignite引擎。FIFA画面迎来了真正革新,球员的全身细节、动作以及物理破坏效果都相当...
    99+
    2023-06-07
    win8.1 win8.1游戏 Win8.1版足球竞技游戏 Win8.1 FIFA 15:UT 游戏 竞技 足球
  • 棋牌游戏服务器怎么选择
    棋牌游戏服务器选择的方法:1、货比三家,选择正规的idc服务器运营商,以保证自身的利益不受到威胁;2、选择快捷稳定的带宽,保证良好的用户体验,以免因服务器不稳定导致玩家流失;3、对比服务器的租用价格,选择性价比高的服务器。具体内容如下:买东...
    99+
    2024-04-02
  • 电脑玩游戏卡如何优化
    这篇“电脑玩游戏卡如何优化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“电脑玩游戏卡如何优化”文章吧。第一步,将电脑的独显打...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作