华为OD机试 - 连续出牌数量 - 深度优先搜索dfs算法(Java 2023 B卷 200分)

news2024/11/18 3:20:51

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
      • 3、说明
    • 四、解题思路
      • 1、题目解读
      • 2、具体步骤
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为0-9中的一个。游戏开始时玩家从手牌中选取一张卡牌打出,接下来如果玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌,他可以继续将该手牌打出,直至手牌打光或者没有符合条件可以继续打出的手牌。

现给定一副手牌,请找到最优的出牌策略,使打出的手牌最多。

二、输入描述

输入为两行,第一行是每张手牌的数字,数字由空格分隔,第二张为对应的每张手牌的颜色,用rybg这4个字母分别代表4种颜色,字母也由空格分隔。手牌数量不超过10。

三、输出描述

输出一个数字,即最多能打出的手牌的数量。

1、输入

1 4 3 4 5
r y b b r

2、输出

3

3、说明

  • 如果打1r,5r,则打出两张
  • 如果打4y,4b,3b,则打出三张

四、解题思路

1、题目解读

从手牌中选取一张卡牌打出,接下来如果玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌,他可以继续将该手牌打出,直至手牌打光或者没有符合条件可以继续打出的手牌。

现给定一副手牌,请找到最优的出牌策略,使打出的手牌最多

2、具体步骤

  1. 第一行输入每张手牌的数字numArr;
  2. 第二行输入每张手牌的颜色colorArr;
  3. 定义集合jokerList,将数字和颜色配对,组成joker;
  4. 遍历扑克牌jokerList;
  5. 通过深度优先搜索dfs算法获取最优的出牌策略,使打出的手牌最多;
    • 当没有牌或者剩余的牌都已经搜索完毕时,退出搜索;
    • 获取下一张扑克牌next;
    • 如果可以打出(玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌);
    • 将next追加到builder;
    • 并从jokerList中移除next;
    • 重置当前的扑克牌joker为next;
    • 连续打出的手牌step+1;
    • 下一张扑克牌坐标归零;
    • 再次调用dfs,循环往复,获取可以打出的最多手牌;
  6. 输出可以打出的最多手牌maxStep;

五、Java算法源码

public class OdTest03 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 每张手牌的数字
        String[] numArr = sc.nextLine().split(" ");
        // 每张手牌的颜色
        String[] colorArr = sc.nextLine().split(" ");

        // 将数字和颜色配对,组成joker
        List<String> jokerList = new ArrayList<String>();
        for (int i = 0; i < numArr.length; i++) {
            jokerList.add(numArr[i] + colorArr[i]);
        }

        int maxStep = 0;
        for (int i = 0; i < jokerList.size(); i++) {
            String joker = jokerList.get(i);
            List<String> tempList = new ArrayList<String>(jokerList);
            StringBuilder builder = new StringBuilder();
            builder.append(joker).append(" ");
            tempList.remove(joker);
            // 通过深度优先搜索dfs算法获取最优的出牌策略,使打出的手牌最多
            int step = def(joker, tempList, 0, 1, builder);

            System.out.println(builder + " ---> 连续打出的手牌数量=" + step);

            builder = new StringBuilder();

            // 获取可以打出的最多手牌
            if (step > maxStep) {
                maxStep = step;
            }
        }
        System.out.println(maxStep);
    }

    /**
     * 通过深度优先搜索dfs算法获取最优的出牌策略,使打出的手牌最多
     *
     * @param joker     当前的扑克牌
     * @param jokerList 剩下的扑克牌
     * @param i         下一张扑克牌坐标
     * @param step      连续打出的手牌数量
     * @param builder   为了便于分析,将连续打出的扑克牌拼接到一起
     * @return
     */
    public static int def(String joker, List<String> jokerList, int i, int step, StringBuilder builder) {
        // 当没有牌或者剩余的牌都已经搜索完毕时,退出搜索
        if (jokerList.size() == 0 || i == jokerList.size()) {
            return step;
        }

        String next = "";
        // 获取下一张扑克牌
        next = jokerList.get(i);
        i++;
        // 是否可以打出
        if (isSame(joker, next)) {
            builder.append(next).append(" ");
            jokerList.remove(next);
            // 重置当前的扑克牌
            joker = next;
            // 连续打出的手牌+1
            step++;
            // 下一张扑克牌坐标归零
            i = 0;
        }
        return def(joker, jokerList, i, step, builder);
    }

    /**
     * 是否可以打出(玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌)
     * @param joker
     * @param next
     * @return
     */
    private static boolean isSame(String joker, String next) {
        for (int i = 0; i < joker.length(); i++) {
            String numOrColor = joker.charAt(i) + "";
            if (next.contains(numOrColor)) {
                return true;
            }
        }
        return false;
    }
}

六、效果展示

1、输入

1 4 3 4 5 6 6
r y b b r g y

2、输出

5

3、说明

1r 5r —> 连续打出的手牌数量=2
4y 4b 3b —> 连续打出的手牌数量=3
3b 4b 4y 6y 6g —> 连续打出的手牌数量=5
4b 4y 6y 6g —> 连续打出的手牌数量=4
5r 1r —> 连续打出的手牌数量=2
6g 6y 4y 4b 3b —> 连续打出的手牌数量=5
6y 4y 4b 3b —> 连续打出的手牌数量=4

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1322783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux--学习记录(3)

G重要编译参数 -g&#xff08;GDB调试&#xff09; -g选项告诉gcc产生能被GNU调试器GDB使用的调试信息&#xff0c;以调试程序编译带调试信息的可执行文件g -g hello.c -o hello编译过程&#xff1a; -E&#xff08;预处理&#xff09; g -E hello.c -o hello.i-S&#xff08;编…

基于springboot+vue 的智能物流管理系统

简介 基于springbootvue 的智能物流管理系统 适用于 设计&#xff0c;课程设计参考与学习用途。仅供学习参考。 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料 **项目编号&#xff1a;springboot074 ** **…

C++刷题 -- KMP算法

C刷题 – KMP算法 文章目录 C刷题 -- KMP算法1.算法讲解2.算法实现 https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 1.算法讲解 KMP算法是一种字符串匹配算法&#xff0c;当出现字符串不匹配时&#xff0c;可以记录一部分之…

数据可视化---箱线图

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

【MySQL】Sql优化之索引的使用方式(145)

索引分类 1.单值索引 单的意思就是单列的值&#xff0c;比如说有一张数据库表&#xff0c;表内有三个字段&#xff0c;分别是 id name numberNo&#xff0c;我给name 这个字段加一个索引&#xff0c;这就是单值索引&#xff0c;因为只有name 这一列是索引&#xff1b; 一个表…

k8s-ingress特性 9

TLS加密 创建证书 测试访问 auth认证 创建认证文件 rewrite重定向 进入域名时&#xff0c;会自动重定向到hostname.html 示例&#xff1a; 测试 版本的升级迭代&#xff0c;之前利用控制器进行滚动更新&#xff0c;在升级过程中无法做到快速回滚 更加平滑的升级&#xff1…

猫头虎带您探索StringUtils3之StringUtils.isEmpty()和StringUtils.isBlank()的区别 ‍

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

低代码汹涌澎湃,真的是风口?

“中国的下一个风口是什么&#xff1f;低代码&#xff1f;你赞同吗&#xff1f;” 可以肯定的是&#xff0c;企业想站上未来产业的风口&#xff0c;”数字化“是必经之路。而低代码是企业向制高点突进的手段。产业的风口&#xff0c;就是产业发展的趋势&#xff0c;只有尽力站上…

SQL面试题挑战01:打折日期交叉问题

目录 问题&#xff1a;SQL解答&#xff1a;第一种方式&#xff1a;第二种方式&#xff1a; 问题&#xff1a; 如下为某平台的商品促销数据&#xff0c;字段含义分别为品牌名称、打折开始日期、打折结束日期&#xff0c;现在要计算每个品牌的打折销售天数&#xff08;注意其中的…

JNI 注册

一、 JNI 静态注册 ① 在 Android 的 Java 层定义方法 : 在 MainActivity 类中定义 如下 Native 方法 ; public native String stringFromJNI();② Native 方法实现 : 下面是一个 Native 方法实现的示例 ; extern "C" JNIEXPORT jstring JNICALL Java_kim_hsl_jni_…

VuePress安装及使用——使用 Markdown 创建你自己的博客网站和电子书

目录 前言一、依赖环境二、vuepress 安装和使用1.初始化2.将 VuePress 安装为本地依赖3. package.json 中添加脚本4. 新建 docs 文件夹5.启动6. 效果 三、进阶使用1.新增配置文件2.安装搜索插件3.config.js 中增加配置4.效果展示5.注意 四、使用主题1.安装2. 目录结构说明&…

fastjson反序列化 CVE-2017-18349

fastjson fastjson 是阿里巴巴开发的 java语言编写的高性能 JSON 库,用于将数据在 Json 和 Java Object之间相互转换。它没有用java的序列化机制,而是自定义了一套序列化机制。 提供两个主要接口&#xff1a; JSON.toJSONString 和 JSON.parseObject/JSON.parse 分别实现序列化…

双指针——找到字符串中的所有字母异位词

https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envTypestudy-plan-v2&envIdtop-100-liked 双指针&#xff0c;每次都统计出来p长度的滑动窗口里的数字,拿Arrays.equals进行对比,然后滑动一小格&#xff0c;减1加1继续比对即可。 class Solut…

AngularJS

理解实现代码的逻辑为主要&#xff0c;代码怎么写为次要。 参考资料&#xff1a; 《AngularJS入门与进阶》&#xff0c;江荣波著 前端开发常用框架 React&#xff1a;由Facebook开发&#xff0c;用于构建用户界面的JavaScript库&#xff0c;以组件化和虚拟DOM著称。 Angular&…

Github项目推荐-30天Python教程

项目地址 GitHub - Asabeneh/30-Days-Of-Python 项目简述 这是一个非常棒的python入门教程&#xff0c;图文并茂&#xff0c;讲解清晰&#xff0c;十分值得推荐。 项目截图

在 Kubernetes 上部署 Python 3.7、Chrome 和 Chromedriver(版本 114.0.5735.90)的完整指南

一、构建基础镜像 docker build -f /u01/isi/DockerFile . -t thinking_code.com/xhh/crawler_base_image:v1.0.2docker push thinking_code.com/xhh/crawler_base_image:v1.0.2 二、K8s运行Pod 三、DockerFile文件 # 基于镜像基础 FROM python:3.7# 设置代码文件夹工作目录…

删除win10服务

之前工作需要在我电脑上安装了一个天气的服务&#xff0c;我想删掉但是在任务管理器里删不掉&#xff0c;请教了大佬 删除方法是&#xff0c;在开始菜单里找到命令提示符 右键-以管理员方式打开命令提示符 输入sc 按enter键&#xff0c;可以查看一些操作命令 删除服务的话&a…

利用虚继承解决菱形继承(钻石继承)的问题 学习笔记

菱形继承概念&#xff1a; 两个派生类继承同一个基类 又有某个类同时继承两个派生类 这种继承又被称为菱形继承&#xff0c;或者钻石继承 定义一个基类Animal&#xff0c;两个派生类Sheep、Camal&#xff0c;SheepCame继承于两个派生类 class Animal { public:int m_Age; }…

java-sec-code中命令注入

java-sec-code中命令注入 不安全的写法(由于我这里使用的是idea搭建的环境&#xff0c;原本命令执行的sh -c 无法运行&#xff0c;后续的输出也会产生乱码&#xff0c;修改部分代码&#xff0c;以便能更好的显示出效果&#xff0c;linux下使用docker木有问题) //需要导入的库文…

物流项目话术(1.5w字精选)

物流项目的分类 技术架构图&#xff08;面试时面试官会要求你画出技术架构图&#xff09; 功能结构图 业务功能流程 流程说明&#xff1a; 用户在【用户端】下单后&#xff0c;生成订单 系统会根据订单生成【取件任务】&#xff0c;快递员上门取件后成功后生成【运单】 用户对…