火车进栈 AcWing (JAVA)

这里有 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--;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值