51. N 皇后
Posted yangbocsu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51. N 皇后相关的知识,希望对你有一定的参考价值。
51. N 皇后
一、题目
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
二、参考代码
class Solution
List<List<String>> res = new LinkedList<>();
public List<List<String>> solveNQueens(int n)
String[][] board = new String[n][n];
for (int i = 0; i < n; i++)
Arrays.fill(board[i],".");
// '.' 表示空,'Q' 表示皇后,初始化空棋盘。
backtrack(board,0);
return res;
public void backtrack(String[][] board, int row)
// 结束条件
if(row == board.length)
res.add(toString(board)); // [".Q..","...Q","Q...","..Q."]
return;
int n = board[row].length;
for (int i = 0; i < n ; i++)
// true的话,是没有冲突
if (isVisted(board,row,i))
board[row][i] = "Q";
// 进入下一行决策
backtrack(board, row + 1);
board[row][i] = ".";
public boolean isVisted(String[][] board, int row,int col)
int n = board.length;
// 检查列是否有皇后互相冲突
for (int i = 0; i <= row; i++)
if (board[i][col] == "Q")
return false;
// 检查左上方是否有皇后互相冲突
for (int i = row - 1,j = col + 1; i >= 0 && j < n; i--, j++)
if (board[i][j] == "Q")
return false;
// 检查左上方
for (int i = row - 1, j = col - 1; i >=0 && j >= 0 ; i--,j--)
if (board[i][j] == "Q")
return false;
return true;
// 将二维的String数组,转换成字符列表 //["..Q.","Q...","...Q",".Q.."]
public List toString(String[][] ans)
LinkedList<String> list = new LinkedList<>();
for(String[] i : ans)
StringBuilder sb = new StringBuilder();
for (int j = 0; j < i.length; j++)
sb.append(i[j]);
list.add(sb.toString());
return list;
以上是关于51. N 皇后的主要内容,如果未能解决你的问题,请参考以下文章