The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
易错点: 判断safe 时候, 插入solution 到 result 时候。
public class Solution {
public List<String[]> solveNQueens(int n) {
List<String[]> ret = new ArrayList<String[]>();
int[] col = new int[n];
placeQueen(n, 0, col, ret);
return ret;
}
private void placeQueen(int n, int cur, int[] col, List<String[]> ret){
if(cur == n){
String[] sol = new String[n];
for(int i = 0; i < n; i++){
StringBuilder sb = new StringBuilder();
for(int j = 0; j < n; j++){
if(col[i] == j){
sb.append('Q');
}else{
sb.append('.');
}
}
sol[i] = sb.toString();
}
ret.add(sol);
return;
}
for(int i = 0; i < n; i++){
if(isSafe(cur, i, col)){
col[cur] = i;
placeQueen(n, cur + 1, col, ret);
}
}
}
private boolean isSafe(int row, int col, int[] buf){
for(int i = 0; i < row; i++){
if(col == buf[i] || row + col == i + buf[i] || row - col == i - buf[i])
return false;
}
return true;
}
}