代码随想录刷题03.11
回溯算法6
内容总结
1.回溯算法的框架:
1)回溯三步骤:形参、终止与搜索体;
2)回溯三关键:剪枝、去重、单层搜索体;
3)回溯问题分析图:N叉树图(写代码前分析问题)与数据流向图(写好代码后验证思路);
2.回溯算法的重点内容:
1)index的含义与使用;
2)去重的分类分析与使用;
3.回溯算法的应用场景:
-
组合问题:N个数里面按一定规则找出k个数的集合;
分析思路:回溯的基本框架+剪枝+去重;
-
排列问题:N个数按一定规则全排列,有几种排列方式;
分析思路:重点关注去重;
-
切割问题:一个字符串按一定规则有几种切割方式;
分析思路:子字符串的截取+index切割;
-
子集问题:一个N个数的集合里有多少符合条件的子集;
分析思路:任何一个节点都要收获结果;
-
棋盘问题:N皇后,解数独等等;
LeetCode题目
解题思路
1.本题比较难,理解的还不是很透彻;
2.之前的题目都是从一维数组出发,本题要从二维出发,其他思路和之前的题目差不多。
代码过程
class Solution {
public:
vector<vector<string>>result;
bool isvalid(int row,int col,vector<string>&chessboard,int n){
for(int i=0;i<row;i++)
{
if(chessboard[i][col]=='Q')return false;
}
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)
{
if(chessboard[i][j]=='Q')return false;
}
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)
{
if(chessboard[i][j]=='Q')return false;
}
return true;
}
void backtracking(vector<string>chessboard,int n,int row){
if(row==n){
result.push_back(chessboard);
return;
}
for(int i=0;i<n;i++)
{
if(isvalid(row,i,chessboard,n)){
chessboard[row][i]='Q';
backtracking(chessboard,n,row+1);
chessboard[row][i]='.';
}
}
return;
}
vector<vector<string>> solveNQueens(int n) {
int row=0;
vector<string>chessboard(n, std::string(n, '.'));
backtracking(chessboard,n,row);
return result;
}
};