按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:

1 2 3
| 输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。
|
示例 2:
提示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| class Solution { List<List<String>> ans = new ArrayList<>(); public List<List<String>> solveNQueens(int n) { char[][] chessboard = new char[n][n]; for(char[] chars : chessboard){ Arrays.fill(chars, '.'); } traversal(chessboard, 0, n); return ans; }
public List<String> arrayToList(char[][] chessboard){ List<String> list = new ArrayList<>(); for(char[] chars : chessboard){ list.add(new String(chars)); } return list; }
public void traversal(char[][] chessboard, int row, int n){ if(row == n){ ans.add(arrayToList(chessboard)); }
for(int col = 0; col < n; col++){ if(isVaild(row, col, n, chessboard)){ chessboard[row][col] = 'Q'; traversal(chessboard, row + 1, n); chessboard[row][col] = '.'; } } }
public boolean isVaild(int row, int col, int n, char[][] chessboard){ for(int i = 0; i < row; i++){ if(chessboard[i][col] == 'Q'){ return false; } } for(int i = row-1,j = col-1; i >= 0 && j >= 0; i--, j--){ if(chessboard[i][j] == 'Q'){ return false; } }
for(int i = row-1, j = col+1; i >= 0 && j <= n -1; i--, j++){ if(chessboard[i][j] == 'Q'){ return false; } } return true; } }
|