51.N皇后
题目:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位
示例1:
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[["Q"]]
理解:
区别于前面的一维,将排序转为了二维,但是都差不多。原先是将当前位置的值利用for循环改变,下一位置的值利用递归改变,现在同理,当前列的值用for循环改变,行的值用递归改变。
需要额外添加isvalid函数来判断是否满足题目要求,其他解题思路与之前相似。
代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<>();
char[][] board = new char[n][n];
for (char[] row: board){
Arrays.fill(row,'.');
}
backtrack(n,0,board,result);
return result;
}
public void backtrack(int n,int row,char[][] board,List<List<String>> result){
if (row==n){
result.add(char2Array(board));
return;
}
for (int col=0;col<n;col++){
board[row][col]='Q';
if (isValid(board,row,col,n)){
backtrack(n,row+1,board,result);
}
board[row][col]='.';
}
}
/**
* 将字符数组转换为字符串列表列表
*
* @param board 二维字符数组,代表棋盘或网格
* @return 返回一个列表,其中包含每个字符数组行转换成的字符串
*/
public List<String> char2Array(char[][] board){
List<String> list=new ArrayList<>();
for (char[] c:board){
list.add(String.valueOf(c));
}
return list;
}
/**
* 将字符数组转换为字符串列表列表
*
* @param board 二维字符数组,代表棋盘或网格
* @return 返回一个列表,其中包含每个字符数组行转换成的字符串
*/
public boolean isValid(char[][] board,int row,int col,int n){
//检查列
for (int i=0;i<row;i++){
if (board[i][col]=='Q'){
return false;
}
}
//检查45°
for (int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
if (board[i][j]=='Q'){
return false;
}
}
//检查135°
for (int i=row-1,j=col+1;i>=0&& j<=n-1;i--,j++){
if (board[i][j]=='Q'){
return false;
}
}
return true;
}
}