N皇后为代表的的回溯算法,模板总结

在这里插入图片描述
方法总结:
1.先聊一聊回溯算法,名字很高端,其实内容很朴实。就是穷举所有方案。再具体一点,可以理解为没有优化的动态规划。动态规划还可以消除一些重复项,优化算法,回溯直接全部举出来,没法优化。数学大佬高斯一生也没有解决8皇后问题,可想回溯算法时间复杂度有多高。
2.解题模板其实也好说,如下

 public void backtracking(){
        if(){//括号里写满足的结束条件
       res.add()//添加合适的路径
           return;
        }
        for(){
        //做出选择
            backtracking();
		//撤销选择
        }
    }

3.其实说白了就是来一个for循环,for循环里面来个递归,递归之前选择路径,递归之后删除选择的路径。
4.有了模板先来leetcode上找一道hard题实操一下。心中有模板,剩下的只是细节问题。



class Solution {
    List<List<String>> res=new ArrayList<>();
    public List<List<String>> solveNQueens(int n) {//程序入口
        ArrayList<char[]> board=new ArrayList<>();
        for(int i=0;i<n;i++){
            char[] chars=new char[n];
            Arrays.fill(chars,'.');
            board.add(chars);
        }
        backtracking(board,0);
        return res;
    }
    **核心代码:回溯算法方法**
   public void backtracking(ArrayList<char[]> board,int row){
        if(row==board.size()){
            ArrayList<String> path=new ArrayList<>();
            for(char[] a:board){
                path.add(new String(a));
            }
            res.add(path);
            return;
        }
        for(int col=0;col<board.size();col++){
            if(!isValid(board,row,col)) continue;
            board.get(row)[col]='Q';
            backtracking(board,row+1);
             board.get(row)[col]='.';
        }
    }
    
    public boolean isValid(ArrayList<char[]> board,int row ,int col){
        for(int i=row-1;i>=0;i--){
            if(board.get(i)[col]=='Q')
            return false;
        }
        for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
            if(board.get(i)[j]=='Q')
            return false;
        }
         for(int i=row-1,j=col+1;i>=0&&j<board.size();i--,j++){
            if(board.get(i)[j]=='Q')
            return false;
        }
        return true;
    }
}

欢迎关注微信公众号“快乐的编程”,
你的关注点赞就是我写文章的最大动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值