华为机试-077-中等-HJ77.火车进站
一、描述
1.1、输入描述
第一行输入一个正整数N(0 < N <= 10),第二行包括N个正整数,范围为1到10。
1.2、输出描述
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。
二、示例
2.1、示例1
输入:
3
1 2 3
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
说明:
第一种方案:1进、1出、2进、2出、3进、3出
第二种方案:1进、1出、2进、3进、3出、2出
第三种方案:1进、2进、2出、1出、3进、3出
第四种方案:1进、2进、2出、3进、3出、1出
第五种方案:1进、2进、3进、3出、2出、1出
请注意,[3,1,2]这个序列是不可能实现的。
三、答案(java)
3.1、方法一
package com.tzq.hwod;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
public class Main {
static List<String> l = new ArrayList<>(); // 储存结果
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
l.clear(); // 静态变量,每次先清空
int nums = in.nextInt();
int[] id = new int[nums];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < nums; i++) {
id[i] = in.nextInt();
}
trainOut(id, 0, stack, "", 0);
// 对结果集排序
Collections.sort(l);
for (String str : l) {
System.out.println(str);
}
}
in.close();
}
// i为入栈次数,n为出栈次数,str存储一趟结果
public static void trainOut(int[] id, int i, Stack<Integer> s, String str, int n) {
if (n == id.length) {
l.add(str); // 如果所有火车均出栈则将当前结果保存
}
if (!s.empty()) { // 栈非空时出栈
int temp = s.pop();
trainOut(id, i, s, str + temp + " ", n + 1);
s.push(temp); // 恢复现场
}
if (i < id.length) {
s.push(id[i]);
trainOut(id, i + 1, s, str, n);
s.pop(); // 恢复现场
}
}
}
四、答案(python 3)
4.1、方法一
#!/usr/bin/python
# -*- coding: UTF-8 -*-
res = []
def dfs(wait, stack, out):
if not wait and not stack:
res.append(' '.join(map(str, out)))
if wait: # 入栈
dfs(wait[1:], stack + [wait[0]], out)
if stack: # 出栈
dfs(wait, stack[:-1], out + [stack[-1]])
while True:
try:
n, nums = int(input()), list(map(int, input().split()))
dfs(nums, [], [])
for i in sorted(res):
print(i)
except:
break