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,本质上是进行排列的求取再判断是否已经符合N皇后的条件
public class Solution {
private int n = 0;
private ArrayList<String[]> l = new ArrayList<String[]>();
private int col[];//记录第i行的皇后所处的列
public void swap(int []num, int i, int j){
int t = num[i];
num[i] = num[j];
num[j] = t;
}
public boolean check(){
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
if(col[i]==col[j] || Math.abs(col[i]-col[j]) == j-i) return false;
}
}
return true;
}
public void dfs(int pos){
if(pos == n){
if(check()){
String[] item = new String[n];
for(int i=0;i<n;i++)
{
StringBuilder strRow = new StringBuilder();
for(int j=0;j<n;j++)
{
if(col[i]==j)
strRow.append('Q');
else
strRow.append('.');
}
item[i] = strRow.toString();
}
l.add(item);
}
return ;
}
for(int i=pos; i<n; i++){
swap(col, pos, i);
dfs(pos+1);
swap(col, i, pos);
}
}
public ArrayList<String[]> solveNQueens(int n) {
this.n = n;
this.col = new int[n];
for(int i=0; i<n; i++) this.col[i] = i;
dfs(0);
return l;
}
}