文章目录
51皇后问题和37解数独对比总结
非常重要的理解就是皇后问题是一维递归,而数独问题是二维递归!
Leetcode51
1.问题描述
2.解决方案
整体思路代码sxl上有,这只做几点强调:
1.vector<vector< string > > ans存放结果相当于存放了多个棋盘
2.回溯函数中的参数vector< string > chessboard,是记录目前为止棋盘的信息
3.因为for中会进行合法检测,所以如果layer==n,说明一定是一个结果集,所以直接收集
4.递归深度和每一层for的宽度都是n
5.合法检测中,没有同行的检测因为for只会在同一行选择一个
代码实现总结:
1.最初的棋盘需要初始化(一种错误的和两种正确的)
//错误二:理解错误,新建一个vector是空的而不像新建一个二维数组不是空的只是其中的元素没有初始化,这个干脆就是空的
//vector<string> chessboard; //感觉不用初始化
//必须初始化一:
string s;
for(int i=0;i<n;i++) s.push_back('.');
vector<string> chessboard(n,s);
//必须初始化二:
vector<string> chessboard1(n,string(n,'.'));
2.for里面定义两个循环变量其中的约束条件不能是逗号,得是&&
//错误一:
//for(int i=layer-1,j=col-1;i>=0,j>=0;i--,j--){
for(int i=layer-1,j=col-1;i>=0&&j>=0;i--,j--)
class Solution {
public:
vector<vector<string> > ans;
void backtracking(int n,int layer,vector<string> chessboard){
if(layer==n) {
ans.push_back(chessboard);
return;
}
for(int col=0;col<n;col++){
if(isValid(n,layer,col,chessboard)== false) continue;
chessboard[layer][col]='Q';
backtracking(n,layer+1,chessboard);
chessboard[layer][col]='.';
}
}
bool isValid(int n,int layer,int col,vector<string> chessboard){
//同行不用去重
//同列去重
for(int i=0;i<layer;i++