import java.util.*; public class Main { private static int[] nums = null; //待进站列车 private static Deque<Integer> waiting = new LinkedList<Integer>(); //站内/待出站列车(后进先出) private static Stack<Integer> station = new Stack<Integer>(); //已出站列车 private static Deque<Integer> already = new LinkedList<Integer>(); //结果集,一个元素表示一种方案 private static List<String> result = new ArrayList<String>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); //放入待进站队列 for (int i = 0; i < n; i++) { waiting.add(in.nextInt()); } dfs(); Collections.sort(result); for (String str : result) { System.out.println(str); } } //深度优先搜索 private static void dfs() { if (waiting.isEmpty() && station.isEmpty()) { add2Result(); return; } //进站 if (!waiting.isEmpty()) { int in = waiting.pollFirst();//待进站列车移出一个 station.push(in);//进入到站内 //进入下一层搜索 dfs(); //因为子搜索会执行完会还原所有队列,所以对外层来说相当于没有操作 //还原,假装没进 waiting.addFirst(in); station.pop(); } //出站 if (!station.isEmpty()) { int out = station.pop();//出站一个 already.addLast(out);//放进已出站列表 //进入下一层搜索 dfs(); //还原,假装没出 station.push(out); already.pollLast(); } } //将当前出站队列加入到结果集 private static void add2Result() { StringBuilder sb = new StringBuilder(); for (Integer i : already) { sb.append(i + " "); } sb.deleteCharAt(sb.length() - 1); result.add(sb.toString()); } }