Leetcode笔记目录
一、题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击,即任何两个皇后都不能处于同一条横行、纵行或斜线上。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例1:
- 输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法
二、解题过程
1.思想
难题,使用回溯法,注意到一行或一列只能有一个皇后,因此我们遍历访问每一行,一旦确定皇后就换下一行,此时只需要设置列,左斜,右斜visited数组,遍历行是通关递归参数+1实现的,而对于每一行进行遍历则是每一次递归内的for循环实现。
2.代码
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
if(n==0)return result; //错误3
vector<string> rows(n,string(n,'.')); //错误2
vector<bool> col(n,false);
vector<bool> left(2*n-1,false);
vector<bool> right(2*n-1,false);
backtrace(n,result,rows,col,left,right,0);
return result;
}
void backtrace(int n,vector<vector<string>>& result, vector<string>& rows, vector<bool>& col,vector<bool>& left,vector<bool>& right,int row){
if(row==n){ //错误4
result.push_back(rows);
return;
}
for(int i=0;i<n;i++){
if(col[i]||left[n-row+i-1]||right[row+i+1])continue; //错误1
rows[row][i]='Q';
col[i]=true;left[n-row+i-1]=true;right[row+i+1]=true;
backtrace(n,result,rows,col,left,right,row+1);
rows[row][i]='.';
col[i]=false;left[n-row+i-1]=false;right[row+i+1]=false;
}
}
- 错误
- 左斜右斜数组是如何根据行数列数和n得出其下标的;
- string变量如何初始化;
- 没有边界判断;
- 注意解法的结构,每次递归完成是找到一个解法即二维数组。
三、总结
和全排列如Leetcode46类似但N皇后是二维的,体会两者解法的区别。