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.."] ]
N皇后问题,回溯法的经典例题。注意判断是否在同斜线的方法(行差==列差):
Math.abs(row-i)==Math.abs(x[row]-x[i])
public class Solution {
List<List<String>> alllist;
int[] x;
public List<List<String>> solveNQueens(int n) {
x=new int[n+1];
alllist=new ArrayList<List<String>>();
queens(1,n);
return alllist;
}
public void queens(int row,int n){
if(row>n){
List<String> list=new ArrayList<String>();
for(int i=1;i<=n;i++){
String str="";
for(int j=1;j<=n;j++){
if(x[i]==j)
str+="Q";
else
str+=".";
}
list.add(str);
}
alllist.add(list);
}
else{
for(int i=1;i<=n;i++){
x[row]=i;
if(place(row))
queens(row+1,n);
}
}
}
public boolean place(int row){
for(int i=1;i<row;i++){
if(x[row]==x[i] || Math.abs(row-i)==Math.abs(x[row]-x[i]))
return false;
}
return true;
}
}