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){
int alreadyAdded = position.get(i);
if(k % n == alreadyAdded % n) // on the same column
return false;
int row = alreadyAdded / n, currentRow = k / n;
if((k % n == alreadyAdded % n - currentRow + row)||(k % n == alreadyAdded % n + currentRow - row)) //skew positions
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);
}
}
leetcode--N-Queens,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/averillzheng/p/3825843.html