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.."] ]
dfs method.
public class Solution {
public List<String[]> solveNQueens(int n) {
List<String[]> placement = new ArrayList<String[]>();
if(n == 1){
placement.add(new String[]{"Q"});
return placement;
}
if(n >= 4){
List<Integer> position = new ArrayList<Integer>();
dfs(n, 0, position, placement);
}
return placement;
}
private boolean dfs(int n, int row, List<Integer> position, List<String[]> placement){
if(row == n) return true;
for(int i = 0; i < n; ++i) {
if(isValidPosition(row * n + i, position, n)){
position.add(row * n + i);
if(dfs(n, row + 1, position, placement))
generateSolution(position,placement, n);
position.remove(row);
}
}
return false;
}
private boolean isValidPosition(int k, List<Integer> position, int n){
for(int i = 0; i < position.size(); ++i){
if( k % n == position.get(i) % n || Math.abs( k % n - position.get(i) % n) == k / n - i)
return false;
}
return true;
}
private void generateSolution(List<Integer> position, List<String[]> placement, int n){
char[] oneRow = new char[n];
for(int i = 0; i < n; ++i)
oneRow[i] = '.';
String[] oneSolution = new String[n];
for(int i = 0; i < n; ++i){
oneRow[position.get(i) % n] = 'Q';
oneSolution[i] = new String(oneRow);
oneRow[position.get(i) % n] = '.';
}
placement.add(oneSolution);
}
}