极客时间算法课笔记整理11——理论讲解+面试题实战:剪枝(N皇后问题、数独问题)

剪枝

(26.30 跳过)
在这里插入图片描述
两种情况:
完全肯定某一分支不是最优解,剪枝
只是局部最优解,优先遍历局部最优解
在这里插入图片描述
作业:可以搜一下阿法狗论文的剪枝方法

面试题

51. N-Queens

在这里插入图片描述
皇后可以攻击横竖撇捺四个方向
两种思路:

  1. constrained programming 约束规划
    这基本上意味着在每次放置皇后后都要有限制。一个人在棋盘上放置一个皇后,这立即排除了一列,一行和两条对角线,以进一步放置皇后。这将传播约束并帮助减少需要考虑的组合数量
  2. backtracking 回溯法
    让我们想象一下,一个人在棋盘上放了几个皇后,这样它们就不会互相攻击了。但所选的组合并不是最佳组合,也没有下一个皇后的位置。要做什么吗?回溯。这意味着返回,改变皇后之前的位置,并尝试再次进行。如果这也不起作用,再次返回。
Set用法

在这里插入图片描述
python代码:
在这里插入图片描述
java代码:
在这里插入图片描述

class Solution {
   
    public List<List<String>> solveNQueens(int n) {
   
        List<List<String>> res= new ArrayList<List<String>>();
        List<String> board = new ArrayList<String>();
        for(int i=0;i<n;i++){
   
            board.add("");
        }
        helper(0, new boolean[n], new boolean[2*n-1], new boolean[2*n-1], board,res);
        return res;
    }
    public void helper(int r, boolean[] cols, boolean[] d1, boolean[] d2,List<String> board,List<List<String>> res){
   
        if(r==cols.length){
   //注意:需要实现深复制,否则board一直是引用传递。
            List<String> board1 = new ArrayList<String>();
            for(int i=0;i<cols.length;i++){
   
                char[] tmp= board.get(i).toCharArray();
                board1.add(new String(tmp));            
            }
            res.add(board1);
        }
        else{
   
            for(int c = 0; c< cols.length ; c++){
   
                int id1= cols.length-1+ r-c;
                int id2= r+c;
                if(!cols[c] && !d1[id1] && !d2[id2]){
   
                    char[] tmp = new char[cols.length];
                    Arrays.fill(tmp,'.');tmp[c]='Q';
                    board.set(r,new String(tmp));
                    cols[c]=true;
                    d1[id1]=true;
                    d2[id2]=true;
                    helper(r+1,cols,d1,d2,board,res);
                    cols[c]=false;
                    d1[id1]=false;
                    d2[id2]=false;
                }
            }
        }
    }
}

在这里插入图片描述

52. N-Queens II

在这里插入图片描述
错误的方法:

class Solution {
   
    public int totalNQueens(int n) {
   
        int res=0;
        helper(0, new boolean[n], new boolean[2*n-1], new boolean[2*n-1], res);
        return res;
    }
    public 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值