考古学家 - 华为OD统一考试

2024-01-11 21:04

本文主要是介绍考古学家 - 华为OD统一考试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OD统一考试

分值: 200分

题解: Java / Python / C++

alt

题目描述

有一个考古学家发现一个石碑,但是很可惜发现时其已经断成多段。
原地发现N个断口整齐的石碑碎片,为了破解石碑内容,考古学家希望有程序能帮忙计算复原后的石碑文字组合数,你能帮忙吗?

备注: 如果存在石碑碎片内容完全相同,则由于碎片间的顺序不影响复原后的碑文内容,仅相同碎片间的位置变化不影响组合

输入描述

第一行输入NN表示石碑碎片的个数
第二行依次输入石碑碎片上的文字内容S共有N

输出描述

输出石碑文字的组合(按照升序排列),行尾无多余空格

示例1

输入:
3
a b c输出:
abc
acb
bac
bca
cab
cba

示例2

输入:
3
a b ab输出:
aab
aba
baa

示例3

输入:
3
a b a输出:
aabb
abab
abba
baab
baba

题解

这是一个典型的排列组合问题,可以使用回溯算法来生成所有可能的组合。

代码大致描述:

  1. 主函数main中,读取石碑碎片的个数N和每个碎片的文字内容S,并进行排序,以便后续生成有序的排列组合。。
  2. 创建一个用于标记是否使用过的数组used和一个用于存储当前组合的容器collect,以及一个记录上次结果的字符串lastResult
  3. 调用backtrack函数进行回溯,生成所有可能的排列组合。
  4. backtrack函数中,检查当前组合的长度是否等于石碑碎片的个数N,如果是则拼接成字符串并输出(避免重复输出相同的排列组合)。
  5. 递归调用backtrack函数,尝试不同的组合。
  6. 在每次递归调用前,标记当前石碑碎片为已使用,以防止重复使用。
  7. 递归调用后,将标记恢复,进行下一轮尝试。

这样,通过回溯算法,可以遍历所有可能的排列组合,最终输出升序排列的石碑文字组合。

Java

import java.util.*;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();String[] cs = new String[n];for (int i = 0; i < n; i++) cs[i] = in.next();Arrays.sort(cs);Solution solution = new Solution(cs, n);solution.backtrack(new ArrayList<>());}
}class Solution {private final String[] cs;private final int n;private String lastResult;private boolean[] used;public Solution(String[] cs, int n) {this.cs = cs;this.n = n;this.used = new boolean[n];}public void backtrack(List<String> collect) {if (collect.size() == n) {String result = String.join("", collect);if (!result.equals(lastResult)) {  // 避免重复的结果输出System.out.println(result);lastResult = result;}return;}String prev = "";  // 记录上次有效的选择for (int i = 0; i < n; i++) {if (used[i] || Objects.equals(cs[i], prev)) continue;used[i] = true;collect.add(cs[i]);backtrack(collect);prev = cs[i];collect.remove(collect.size() - 1);used[i] = false;}}
}

Python

n = int(input())
cs = input().split()
cs.sort()last_result = None
used, collect = [False] * n, []def backtrack():global last_result, used, collectif len(collect) == n:  # 组合完成result = "".join(collect)if result != last_result:  # 避免重复的结果输出last_result = resultprint(last_result)returnprev = Nonefor i in range(n):if used[i] or cs[i] == prev:  # 元素被选中或元素相同continueused[i] = Truecollect.append(cs[i])backtrack()collect.pop()prev = cs[i]used[i] = Falsebacktrack()

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>using namespace std;void backtrack(const vector<string>& cs, int n, vector<bool>& used, vector<string>& collect, string& lastResult) {if (collect.size() == n) {string result = accumulate(collect.begin(), collect.end(), string(""));if (result != lastResult) {cout << result << endl;lastResult = result;}return;}string prev = "";for (int i = 0; i < n; i++) {if (used[i] || cs[i] == prev) continue;used[i] = true;collect.push_back(cs[i]);backtrack(cs, n, used, collect, lastResult);prev = cs[i];collect.pop_back();used[i] = false;}
}int main() {int n;cin >> n;vector<string> cs(n);for (int i = 0; i < n; i++) {cin >> cs[i];}sort(cs.begin(), cs.end());vector<bool> used(n, false);vector<string> collect;string lastResult;backtrack(cs, n, used, collect, lastResult);return 0;
}

相关练习题

题号题目难易
LeetCode 面试题 08.07面试题 08.07. 无重复字符串的排列组合中等
LeetCode 4747. 全排列 II中等
LeetCode LCR 083LCR 083. 全排列中等

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

这篇关于考古学家 - 华为OD统一考试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/595687

相关文章

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和