方法总结:
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;
}
}
欢迎关注微信公众号“快乐的编程”,
你的关注点赞就是我写文章的最大动力。