题解 | #火车进站#

还是dfs,这是第二次自己递归调用栈一步一步调试出来的。注意,递归调用dfs,需要克隆栈状态和出栈顺序。

import java.util.*;
public class Main {
    static List<List<Integer>> result = new ArrayList<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] car = new int[n];
        for (int i = 0; i < n; i++) {
            car[i] = sc.nextInt();
        }
        List<Integer> sb = new ArrayList<>();  // 存储单词出站顺序
        List<Integer> list = new ArrayList<>();  // 当做一个栈使用
        dfs(list, car, sb, 0);
        
        // 排序处理
        List<String> sortedResult = new ArrayList<>();
        while (result.size() != 0) {
            List<Integer> listTmp = result.remove(0);
            String str = listTmp.toString();
            str = str.replaceAll(",", "");
            sortedResult.add(str.substring(1, str.length()-1));
        }
        Collections.sort(sortedResult);
        for (String str : sortedResult) {
            System.out.println(str);
        }
    }

    public static void dfs(List<Integer> list, int[] car, List<Integer> sb, int cur) {
        if (cur == car.length - 1) {
            sb.add(car[cur]);
            while (!list.isEmpty()) {
                sb.add(list.remove(list.size()-1));
            }
            result.add(sb);
            return;
        }

        // 此位置直接进栈
        list.add(car[cur]);
        List<Integer> tmpList1 = new ArrayList<>(list);
        List<Integer> tmpSb1 = new ArrayList<>(sb);
        dfs(tmpList1, car, tmpSb1, cur+1);

        // 此位置出栈(出栈元素加到sb中)
        // 此处是用while,不能用if,因为可以一直出栈再栈空
        while (!list.isEmpty()) {
            sb.add(list.remove(list.size()-1));
            List<Integer> tmpList2 = new ArrayList<>(list);
            List<Integer> tmpSb2 = new ArrayList<>(sb);
            dfs(tmpList2, car, tmpSb2, cur+1);
        }
    }
}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务