携程笔试1-排列问题

public class XieCheng2 {
    /**
     * 给定 n个岛屿的分数:  x1 x2.. xn
     * m张牌:  y1 y2.. ym
     * 每次前进 y1
     * 问最高分数
     */
    public static void main(String[] args) {
        int n=4, m=2;
        int[] scores = new int[]{1,2,3,4};

        int[] cards = new int[]{1,2};
        int maxScores=0;
        LinkedList<ArrayList<Integer>> allCards = getAll(cards);

        for (ArrayList<Integer> allCard : allCards) {
            int cIndex=0;
            int cScore=scores[0];
            for (int i = 0; i < allCard.size(); i++) {
                Integer cardNum = allCard.get(i);
                cIndex += cardNum;
                if(cIndex>n-1){
                    break;
                }
                cScore+=scores[cIndex];

            }
            maxScores = Math.max(cScore,maxScores);
        }
        System.out.println(maxScores);
    }
    public static LinkedList<ArrayList<Integer>> list = new LinkedList<>();
    public static LinkedList<ArrayList<Integer>> getAll(int[] a){
        boolean[] used = new boolean[a.length];
        Deque<Integer> deque = new ArrayDeque<>();

        for(int i=0; i<a.length; i++){
            deque.addLast(a[i]);
            used[i] = true;
            dfs(a.length,a,used,deque);
            used[i] = false;
            deque.removeLast();
        }
        return list;
    }

    private static void dfs(int n, int[] a, boolean[] used, Deque<Integer> deque) {
        if(deque.size() == n){
            list.add(new ArrayList<>(deque));
            return;
        }
        for(int i=0; i<a.length; i++){
            if(!used[i]){
                deque.addLast(a[i]);
                used[i] = true;
                dfs(a.length,a,used,deque);
                used[i] = false;
                deque.removeLast();
            }
        }
    }
}
原文地址:https://www.cnblogs.com/wsZzz1997/p/14766470.html