当前位置: 首页 > article >正文

机试题——考古学家

题目描述

有一个考古学家发现一个石碑,但是很可惜,发现时其已经断成多段,原地发现n个断口整齐的石碑碎片。

为了破解石碑内容,考古学家希望有程序能帮忙计算复原后的石碑文字组合数,你能帮忙吗?

输入描述

第一行输入一个整数 n,表示石碑碎片的个数。

第二行输入n个字符串,表示n个石碑碎片的内容,每个字符串之间有空格。

输出描述

输出石碑文字的所有组合(按照升序排列),每个组合占一行。

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

用例输入

3 
a b c
abc 
acb 
bac 
bca 
cab 
cba
3 
a b a
aab 
aba 
baa
3 
a b ab
aabb 
abab 
abba 
baab 
baba

解题思路

  1. 输入数据处理

    • 读取输入的整数 nn 个碎片字符串。
  2. 排列生成

    • 使用 全排列 来生成所有碎片的排列组合。
    • 对碎片进行排序,确保排列是按字典序生成的。
  3. 去重

    • 利用 next_permutation 可以生成当前序列的下一个排列,确保不重复地生成所有排列。
  4. 输出处理

    • 将每一种排列的结果拼接成一个字符串,并将所有排列按照顺序输出。
  5. 实现技巧

    • 使用 next_permutation 生成排列,并通过排序保证结果按字典序排列。

代码

#include <iostream>
#include <vector>
#include <map>
#include <climits>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;

    vector<string> fragments(n);
    for (int i = 0; i < n; i++) {
        cin >> fragments[i];
    }

    // 对碎片进行排序,保证生成的排列是按字典序的
    sort(fragments.begin(), fragments.end());

    // 用来存储所有的排列结果
    vector<string> result;

    // 使用next_permutation生成所有排列
    do {
        string combined = "";
        for (int i = 0; i < n; i++) {
            combined += fragments[i];
        }
        result.push_back(combined);
    } while (next_permutation(fragments.begin(), fragments.end()));

    // 输出所有的排列,拼接成一个字符串输出
    for (const auto& s : result) {
        cout << s<<"\n";
    }
}

http://www.kler.cn/a/527544.html

相关文章:

  • C语言实现库函数strlen
  • 2025年1月30日(任意截面、自定义截面梁的设置)
  • MYSQL--一条SQL执行的流程,分析MYSQL的架构
  • Privacy Eraser,电脑隐私的终极清除者
  • 基于UKF-IMM无迹卡尔曼滤波与交互式多模型的轨迹跟踪算法matlab仿真,对比EKF-IMM和UKF
  • APT (Advanced Package Tool) 安装与使用-linux014
  • C++初阶 -- 初识STL和string类详细使用接口的教程(万字大章)
  • 简单的爱心跳动表白网页(附源码)
  • 在本地部署DSR1模型的技术方案和步骤指南
  • PCA9685 一款由 NXP Semiconductors 生产的 16 通道、12 位 PWM(脉宽调制)控制器芯片
  • 基于 yolov8_pyqt5 自适应界面设计的火灾检测系统 demo:毕业设计参考
  • Keepalived高可用集群企业应用实例一
  • 字符串p型编码(信息奥赛一本通1145)
  • 数据结构:栈篇
  • 【算法】分治
  • 常用Android模拟器(雷电 MuMu 夜神 Genymotion 蓝叠) - 20250131
  • 基于LLM的垂直领域问答方案
  • 深入理解 C# 与.NET 框架
  • windows电脑运行日志用户行为记录查看和清理工具
  • 【字符串两大注意事项】