N 皇后 I
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例一:
n=4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
核心思想:回溯。
以行为单位,每次只需要往不同列Q即可,但是不是简单的放Q,而是当前位置的同一行、同一列、两条斜线上都不能有皇后,所以要判断当前位置是否能放皇后,由于是从第0行开始,所以当前行以下肯定没皇后,所以只用判断当前列、左上角斜线、右上角斜线,当都没有皇后时就可以往当前位置放皇后了,以此进行递归即可,那递归的终止条件呢?我们从输出中分析,很明显,子顺序表中的每一个元素分别对应每一行的可能,所以需要用一个顺序表去保存结果,所以递归终止条件就是当子顺序表的长度达到n时就结束递归。
如何回溯?
当将本行的皇后以及不是皇后的位置设置好后,继续递归,本次递归完成后,将子顺序表中的最后一个元素移除,并将标记当前皇后位置的数组的值变为空,实现回溯。
class Solution {
List<List<String>>list=new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
char[][]quen=new char[n][n];//记录皇后位置
solve(quen,new ArrayList<String>(),0);//从第零行开始
return list;
}
public void solve(char[][]quen,List<String>l,int cow){
if(l.size()==quen.length){
list.add(new ArrayList<String>