import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}
List<List<Integer>> result = new ArrayList<>();
backtrack(0, new ArrayList<>(), new ArrayList<>(), result, a);
Collections.sort(result, new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> o1, List<Integer> o2) {
for (int i = 0; i < o1.size(); i++) {
int cmp = Integer.compare(o1.get(i), o2.get(i));
if (cmp != 0) {
return cmp;
}
}
return 0;
}
});
for (List<Integer> list : result) {
StringBuilder sb = new StringBuilder();
for (int num : list) {
sb.append(num).append(" ");
}
System.out.println(sb.toString().trim());
}
}
private static void backtrack(int index, List<Integer> stack,
List<Integer> path, List<List<Integer>> result, int[] a) {
if (path.size() == a.length) {
result.add(new ArrayList<>(path));
return;
}
// 尝试弹出栈顶元素
if (!stack.isEmpty()) {
int popped = stack.remove(stack.size() - 1);
path.add(popped);
backtrack(index, stack, path, result, a);
path.remove(path.size() - 1);
stack.add(popped);
}
// 尝试入栈下一个元素
if (index < a.length) {
int next = a[index];
stack.add(next);
backtrack(index + 1, stack, path, result, a);
stack.remove(stack.size() - 1);
}
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
输入处理:读取火车数量和入站顺序。
回溯函数:递归生成所有可能的出站顺序。每次递归处理两种选择:弹出栈顶元素或入栈下一个元素。
结果排序:使用自定义比较器对结果按字典序排序。
输出结果:将排序后的结果按格式输出。



京公网安备 11010502036488号