这里有 n列火车将要进站再出站,但是,每列火车只有 1节,那就是车头。
这 n列火车按 1到
n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。
车站示意如图:
出站<—— <——进站
|车|
|站|
|__|
现在请你按《字典序》输出前 20 种可能的出栈方案。
输入格式 :
输入一个整数 n ,代表火车数量。
输出格式:
按照《字典序》输出前 20 种答案,每行一种,不要空格。
数据范围:
1≤n≤20
输入样例:
3
输出样例:
123
132
213
231
321
解题思路:用栈代替车站,变量 state3 代表将要存入的数字,数组a存入方案。本题无非就是出站和进站两种情况。
这和迷宫问题的区别就是,迷宫问题新探索方向有四种,在一个for循环内实现,而本题是出站(车站)或者入站。需要分别用一个if条件完成。
由于先出站后入站字典序小,所以入站在出站前,而且需要回溯。
理论成立代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int[n + 1];//细节 + 1
Stack<Integer> stack = new Stack();
solution s = new solution();
s.dfs(a, 0, n, 1, stack);//变量意义:储存数据,最开始的储存位置,边界,正要存储的数,车站
}
}
class solution{
int k = 20;
public void dfs(int a[], int i, int n, int state3, Stack<Integer> stack){
if(i == n){//溢出则退出
print(a);//打印
return;
}
if(!stack.isEmpty()){//站内车先走
int temp = stack.pop();
a[i] = temp;
dfs(a, i + 1, n, state3, stack);
stack.add(temp);//回溯
}
if(state3 <= n){//进站
stack.add(state3);
state3 ++;
dfs(a, i, n, state3, stack);
state3 --;
stack.pop();//回溯
}
}
public void print(int a[]){
if(k > 0){
for(int i = 0; i < a.length - 1; i ++)//打印前n - 1
System.out.print(a[i]);
System.out.println();
k--;
}
}
}