题解 | #火车进站#

火车进站

https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109

import java.util.*;

public class Main {
    
    static int N;
    static List<Station> list = new ArrayList<>();

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] trains = new int[N = in.nextInt()];
        fill(trains, in);
        // Station是自己定义的一个数据结构 用于存储列车出站顺序 排序 输出等
        dfs(trains, 0, 0, new LinkedList<Integer>(), new Station());
        Collections.sort(list);
        list.forEach(System.out::println);
    }

    static void dfs(int[] trains, int index, int outCount, LinkedList<Integer> stack, Station station) {
        // 如果所有列车都出站了 添加这次出站顺序
        if (outCount == N) {
            list.add(station);
        } else {
            // 列车出站 
            if (!stack.isEmpty()) {
                int train = stack.pop();
                dfs(trains, index, outCount + 1, stack, station.clone().in(train));
                // 中断恢复
                stack.push(train);
            }
            // 列车进站
            if (index < N) {
                stack.push(trains[index]);
                dfs(trains, index + 1, outCount, stack, station);
                // 中断恢复
                stack.pop();
            }
        }
    }

    static void fill(int[] arr, Scanner in) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = in.nextInt();
        }
    }

    static class Station implements Comparable<Station> {
        
        int[] trains = new int[N];
        int size = 0;

        Station() {}

        Station(int[] trains, int size) {
            this.trains = trains;
            this.size = size;
        }

        public Station in(int train) {
            this.trains[size++] = train;
            return this;
        }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < trains.length; i++) {
                sb.append(trains[i]).append(" ");
            }
            return sb.toString();
        }

        @Override
        public int compareTo(Station station) {
            for (int i = 0; i < this.trains.length; i++) {
                if (this.trains[i] != station.trains[i]) {
                    return this.trains[i] - station.trains[i];
                }
            }
            int n = this.trains.length;
            return this.trains[n - 1] - station.trains[n - 1];
        }

        @Override
        public Station clone() {
            int[] trains = Arrays.copyOf(this.trains, N);
            return new Station(trains, size);
        }
    }
}



#华为笔试#
全部评论

相关推荐

10-29 15:38
门头沟学院 Java
榕城小榕树:难道你简历里写了配送路径优化算法?
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务