题目描述
有一个考古学家发现一个石碑,但是很可惜,发现时其已经断成多段,原地发现n个断口整齐的石碑碎片。为了破解石碑内容,考古学家希望有程序能帮忙计算复原后的石碑文字组合数,你能帮忙吗?
输入描述
第一行输入n,n表示石碑碎片的个数。
第二行依次输入石碑碎片上的文字内容s,共有n组。
输出描述
输出石碑文字的组合(按照升序排列),行末无多余空格。
用例
输入 | 3 a b c |
输出 | abc acb bac bca cab cba |
说明 | 无 |
输入 | 3 a b a |
输出 | aab aba baa |
说明 | 无 |
题目解析
全排列问题!!!
原题参考:47. 全排列 II - 力扣(LeetCode)
解体思路
解决这个问题的方法是使用深度优先搜索(DFS)遍历所有可能的组合。以下是详细的思路:
- 首先,读取输入的石碑碎片个数
n
和石碑碎片上的文字内容s
。 - 将输入的石碑碎片内容存入一个列表
charArray
,并对其进行排序。排序的目的是为了在遍历过程中方便地跳过重复的组合。 - 定义一个深度优先搜索函数
dfs
,其中包含以下参数:charArray
:存储石碑碎片内容的列表。depth
:当前搜索的深度。path
:存储已经使用过的碎片。used
:记录每个碎片是否被使用过。result
:存储所有可能的组合。
- 在
dfs
函数中,首先检查当前搜索的深度是否等于石碑碎片的个数。如果是,则将当前组合加入结果列表result
。 - 遍历
charArray
中的每个碎片。对于每个碎片,检查它是否已经被使用过,以及它是否与前一个碎片相同且前一个碎片未被使用。如果满足这些条件,则跳过当前碎片。 - 将当前碎片添加到
path
中,并标记它为已使用。然后递归地搜索下一个碎片。 - 在递归返回后,执行回溯操作:将当前碎片从
path
中移除,并标记它为未使用。 - 调用
dfs
函数,开始搜索所有可能的组合。 - 最后,输出所有找到的组合。
这种方法可以有效地遍历所有可能的石碑文字组合,并通过跳过重复的组合来减少搜索空间。
C++
#include <iostream>