ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

回溯day6

2022-04-22 20:31:23  阅读:146  来源: 互联网

标签:return get day6 res list int 回溯 new


51. N 皇后

class Solution {
    private List<List<String>> res;
    //存第i行放置位置
    private int[] place;
    public List<List<String>> solveNQueens(int n) {
        res = new ArrayList<>();
        place = new int[n];
        //i代表行
        backtracking(n, 0);
        return res;
    }
    private void backtracking(int n, int i) {
        //放满存可行解
        if (i >= n) {
            char[][] cc = new char[n][n];
            for (char[] c : cc) {
                Arrays.fill(c, '.');
            }
            for (int k = 0; k < n; k++) {
                cc[k][place[k]] = 'Q';
            }
            List<String> list = new ArrayList<>();
            for (char[] c : cc) {
                list.add(new String(c));
            }
            res.add(list);
        }
        //试探该行是否存在可放置的列
        for (int j = 0; j < n; j++) {
            if (placeQueen(i, j)) {
                place[i] = j;
                backtracking(n, i + 1);
                //隐藏回溯 后续会覆盖
            }
        }
    }
    //x:行 y:列
    private boolean placeQueen(int x, int y) {
        //第一行总是可以放的
        if (x == 0) return true;
        //该位置和前面行是否冲突
        for (int i = 0; i < x; i++) {
            //在同一列上或对角线上 冲突 返回false
            if (y == place[i] || Math.abs(x - i) == Math.abs(y - place[i]))
                return false;
        }
        return true;
    }
}

332. 重新安排行程

class Solution {
    //此题关键在于容器的选择和使用上
    private Map<String, Map<String, Integer>> map;
    private LinkedList<String> res;
    public List<String> findItinerary(List<List<String>> tickets) {
        res = new LinkedList<>();
        map  = new HashMap<>();
        //将List<List<String>> 转化成Map<String, Map<String, Integer>>
        //Map<String, Integer>存同一个起点的可达终点以及同一起点目的地机票出现的次数,要保证每张机票都用到
        Map<String, Integer> temp;
        for (List<String> list : tickets) {
            if (map.containsKey(list.get(0))) {
                temp = map.get(list.get(0));
                temp.put(list.get(1), temp.getOrDefault(list.get(1), 0) + 1);
            } else {
                //使用TreeMap排序 默认升序 优先处理在字典中排前面的
                temp = new TreeMap();
                temp.put(list.get(1), 1);
            }
            map.put(list.get(0), temp);
        }
        res.add("JFK");
        backtracking(tickets.size());
        return new ArrayList<>(res);
    }

    private boolean backtracking(int size) {
        //机票数+1就是机场数 使用boolean可以让父调用接受并直接返回 前面使用TreeSet排序过,找到的一个结果就是最优的
        if (size + 1 == res.size()) {
            return true;
        }
        String des = res.getLast();
        if (map.containsKey(des)) {
            //所有可以走的路径都走一下
            for (Map.Entry<String, Integer> path : map.get(des).entrySet()) {
                int count = path.getValue();
                if (count > 0) {
                    res.add(path.getKey());
                    path.setValue(count - 1);
                    if (backtracking(size)) return true;
                    //回溯
                    res.removeLast();
                    path.setValue(count);
                } //if
            } //for
        }//if
        return false;
    }
}

 

 

参考:programmercarl.com

标签:return,get,day6,res,list,int,回溯,new
来源: https://www.cnblogs.com/lizihhh/p/backtracking06.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有