【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 石碑文字组合(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

石碑文字组合(200分)

🌍 评测功能需要 订阅专栏 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • 🍪 石碑文字组合
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码

🍪 石碑文字组合

问题描述

考古学家 LYA 在一次考古挖掘中发现了一块断裂成 n n n 段的石碑,每一段石碑上都刻有一个小写字母。为了破解石碑的内容,LYA 需要将这 n n n 段石碑按照一定的顺序进行排列组合。现在请你帮助 LYA 计算出所有可能的石碑文字组合,并按字典序升序输出。

输入格式

第一行包含一个正整数 n n n,表示石碑碎片的数量,满足 1 ≤ n ≤ 8 1 \le n \le 8 1n8

第二行包含 n n n 个由空格隔开的小写字母,表示每段石碑上的文字内容。

输出格式

按字典序升序输出所有可能的石碑文字组合,每个组合占一行。

样例输入

3
a b c
3
a b a

样例输出

abc
acb
bac
bca
cab
cba
aab
aba
baa

数据范围

  • 1 ≤ n ≤ 8 1 \le n \le 8 1n8

题解

本题是一道典型的排列组合问题,可以使用 DFS(深度优先搜索)或回溯法来解决。

具体思路如下:

  1. 用一个数组 vis 来标记每个字母是否已经被使用过,初始时所有字母都未被使用。

  2. 从第一个位置开始,枚举每个未被使用过的字母,将其加入当前排列,并标记为已使用。

  3. 递归处理下一个位置,直到所有位置都被填满,得到一个完整的排列,将其加入答案数组。

  4. 回溯时,将当前位置的字母标记为未使用,以便在其他排列中重新使用。

  5. 当所有排列都被生成后,对答案数组进行去重和排序,按字典序升序输出即可。

根据上述思路,我们可以很容易地写出 DFS 或回溯的代码。时间复杂度为 O ( n ! ) O(n!) O(n!),其中 n n n 为石碑碎片的数量。由于 n n n 的范围较小,因此该算法可以在规定时间内完成。

参考代码

  • Python
def dfs(idx, cur):if idx == n:ans.append(''.join(cur))returnfor i in range(n):if not vis[i]:vis[i] = Truecur.append(s[i])dfs(idx + 1, cur)vis[i] = Falsecur.pop()n = int(input())
s = input().split()
vis = [False] * n
ans = []
dfs(0, [])
ans = sorted(set(ans))
for a in ans:print(a)
  • Java
import java.util.*;public class Main {static void dfs(int idx, ArrayList<String> cur, String[] s, boolean[] vis, ArrayList<String> ans, int n) {if (idx == n) {StringBuilder result = new StringBuilder();for (String str : cur) {result.append(str);}ans.add(result.toString());return;}for (int i = 0; i < n; i++) {if (!vis[i]) {vis[i] = true;cur.add(s[i]);dfs(idx + 1, cur, s, vis, ans, n);vis[i] = false;cur.remove(cur.size() - 1);}}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine(); // Consume newlineString[] s = scanner.nextLine().split(" ");boolean[] vis = new boolean[n];ArrayList<String> ans = new ArrayList<>();ArrayList<String> cur = new ArrayList<>();dfs(0, cur, s, vis, ans, n);Collections.sort(ans);LinkedHashSet<String> set = new LinkedHashSet<>(ans);ans = new ArrayList<>(set);for (String a : ans) {System.out.println(a);}scanner.close();}
}
  • Cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>void dfs(int idx, std::vector<std::string>& cur, std::vector<std::string>& s, std::vector<bool>& vis, std::vector<std::string>& ans, int n) {if (idx == n) {std::string result;for (const auto& str : cur) {result += str;}ans.push_back(result);return;}for (int i = 0; i < n; ++i) {if (!vis[i]) {vis[i] = true;cur.push_back(s[i]);dfs(idx + 1, cur, s, vis, ans, n);vis[i] = false;cur.pop_back();}}
}int main() {int n;std::cin >> n;std::vector<std::string> s(n);for (int i = 0; i < n; ++i) {std::cin >> s[i];}std::vector<bool> vis(n, false);std::vector<std::string> ans;std::vector<std::string> cur;dfs(0, cur, s, vis, ans, n);std::sort(ans.begin(), ans.end());ans.erase(unique(ans.begin(), ans.end()), ans.end());for (const auto& a : ans) {std::cout << a << std::endl;}return 0;
}

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

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

相关文章

Rust语言-线程间的消息传递mpsc::Sender

文章目录 Rust语言-线程间的消息传递mpsc::Sender标准库std::sync::mpsc消息通道mpsc::Sender实战举例 Rust语言-线程间的消息传递mpsc::Sender 标准库std::sync::mpsc 官方文档&#xff1a;https://rustwiki.org/zh-CN/std/sync/mpsc/index.html 参考URL: https://course.rs…

[C++][数据结构][哈希表]详细讲解

目录 1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决5.闭散列1.何时扩容&#xff1f;如何扩容&#xff1f;2.线性探测3.二次探测 6.开散列(哈希桶)1.概念2.开散列增容3.开散列思考只能存储key为整形的元素&#xff0c;其他类型怎么解决&#xff1f;除留余数法&#xff0c;最好模…

一季度直播6000场,同比增长60%,遥望科技透露重要信息

6月17日&#xff0c;经由深圳证券交易所许可&#xff0c;遥望科技&#xff08;股票代码&#xff1a;002291&#xff09;正式对《年报问询函》进行公开回复&#xff0c;就经营的多个维度做出解释和回应。 在回复中&#xff0c;遥望科技预测2024年毛利率为14.4%&#xff0c;相比…

[absl_py][python]absl_py所有whl文件下载地址汇总

absl_py是Google开发并维护的一个Python软件包&#xff0c;它是C Abseil库的Python版本。该库旨在提供一系列高质量的、跨平台的实用工具&#xff0c;帮助开发者构建大规模软件项目。以下是关于absl_py的详细介绍&#xff1a; 功能概述&#xff1a; 字符串处理&#xff1a;abs…

conda在不同服务器上迁移环境的方法

conda在不同服务器上迁移环境的方法 conda迁移环境&#xff08;若服务器cuda配置相同&#xff09;我的迁移方法&#xff1a;可能要用到的压缩命令和解压命令&#xff1a; 若服务器cuda版本等配置不同 conda迁移环境&#xff08;若服务器cuda配置相同&#xff09; 我的迁移方法…

【CSS in Depth2精译】1.1.1 样式表来源

您添加到网页的样式表并非浏览器呈现样式的唯一来源。样式表有三种不同的类型或来源。您添加到页面的样式称为 作者样式&#xff08;author styles&#xff09;&#xff1b;此外还有 用户样式&#xff08;user styles&#xff09;&#xff0c;即终端用户设置的自定义样式&#…

configure: error: library ‘crypto‘ is required for OpenSSL

1、执行命令&#xff1a;./configure --prefix/opt/app/postgresql --with-openssl 报错&#xff1a; 2、解决办法 执行命令&#xff1a;yum install openssl-devel 重新执行 ./configure --prefix/opt/app/postgresql --with-openssl

Ubuntu服务器的GitLab部署

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

充电学习—3、Uevent机制和其在android层的实现

sysfs 是 Linux userspace 和 kernel 进行交互的一个媒介。通过 sysfs&#xff0c;userspace 可以主动去读写 kernel 的一些数据&#xff0c;同样的&#xff0c; kernel 也可以主动将一些“变化”告知给 userspace。也就是说&#xff0c;通过sysfs&#xff0c;userspace 和 ker…

探索序列到序列模型:了解编码器和解码器架构的强大功能

目录 一、说明 二、什么是顺序数据&#xff1f; 三、编码器解码器架构的高级概述&#xff1a; 3.1 编码器和解码器架构的简要概述&#xff1a; 3.2 训练机制&#xff1a;编码器和解码器架构中的前向和后向传播&#xff1a; 四、编码器解码器架构的改进&#xff1a; 4.1.…

一道session文件包含题

目录 环境说明 session文件包含getshell 审计源码 session包含 base64在session中的解码分析 题目&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Q0BN08b8gWiVE4tOnirpTA?pwdcate 提取码&#xff1a;cate 环境说明 这里我用的是linux&#xff0c;也可以用p…

【论文阅读】-- DeepVisualInsight: 深度分类训练时空因果关系的时间旅行可视化

中文标题 摘要引言动机举例相关工作时间旅行可视化的属性符号定义邻居保护属性边界距离保持属性逆投影保持属性暂时保存属性 方法 δ \delta δ-边界估计(k)-BAVR综合体建设逆投影保持时间连续性 评估案例分析结论参考文献 摘要 了解深度学习模型的预测在训练过程中是如何形成…

[WTL/Win32]_[中级]_[MVP架构在实际项目中应用的地方]

场景 在开发Windows和macOS的界面软件时&#xff0c;Windows用的是WTL/Win32技术&#xff0c;而macOS用的是Cocoa技术。而两种技术的本地语言一个主打是C,另一个却是Object-c。界面软件的源码随着项目功能增多而增多&#xff0c;这就会给同步Windows和macOS的功能造成很大负担…

Linux-远程访问及控制

一、SSH远程管理 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令。与早期的 Telent&#xff08;远程登录…

【Spine学习11】之 战士攻击动作 思路总结(手动调整贝塞尔曲线实现前快后慢)

拿到一份psd文件先观察检查一下图片顺序有没有问题&#xff0c; 重点看一下人物的腿部分层&#xff0c;&#xff08;如果是大小腿分开画的就网格可打可不打&#xff0c;如果是连在一起画的&#xff0c;那必须打网格&#xff09; 拿着剑的时候剑和手的层级有没有错位&#xff0c…

js下拉框选择筛选数据数据联动

在JavaScript中&#xff0c;可以通过事件监听和DOM操作来实现下拉框选择筛选数据的联动。 首先&#xff0c;在HTML中创建两个下拉框&#xff0c;分别为"select1"和"select2"&#xff1a; <select id"select1"><option value"opt…

Android SDK是什么?

在深入探讨Android SDK之前&#xff0c;我们首先需要明确其定义和重要性。Android SDK&#xff0c;全称Android Software Development Kit&#xff0c;是Android应用开发的核心工具集。它提供了一系列开发Android应用所需的工具、库和文档&#xff0c;使开发者能够利用这些资源…

P3391 【模板】文艺平衡树(@无旋Treap,* *)

【模板】文艺平衡树 - 洛谷 题目描述 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 5 4 3 2 1&#xff0c;翻转区间是 [2,4] 的话&#xff0c;…

HCS-华为云Stack-容器网络

HCS-华为云Stack-容器网络 容器隧道overlay VPC网络

第〇篇:深入Docker的世界系列博客介绍

深入Docker的世界系列博客介绍 欢迎来到“深入Docker的世界”系列博客&#xff0c;这是一次旨在全面探索Docker容器化技术的冒险之旅。从基础原理到高级应用&#xff0c;再到实践案例分析&#xff0c;我们将深入挖掘Docker的每一个角落&#xff0c;帮助你不仅掌握这项技术的实…