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皇后,回溯遍历。N皇后问题比较复杂的部分就是判断部分,开始忘了斜线上不能重合的情况,后来加上了就对了。
public class Solution {
private boolean isRight(int[][] grid, int s, int t, int n){
for(int i=0; i< s; i++ ){
if(grid[i][t]==1){
return false;
}
}
for(int i=0; i< t; i++){
if(grid[s][i] ==1){
return false;
}
}
int i = s-1;
int j =t -1;
while(i>=0 && j>=0){
if(grid[i][j]==1){
return false;
}
i--;
j--;
}
i=s-1;
j=t+1;
while(i>=0 && j <n){
if(grid[i][j]==1){
return false;
}
i--;
j++;
}
return true;
}
private List<String> generateList(int[][] grid){
List<String> line = new ArrayList<String>();
for(int[] col : grid){
StringBuilder strBuilder = new StringBuilder();
for(int ele : col){
if(ele==1){
strBuilder.append("Q");
}else{
strBuilder.append(".");
}
}
line.add(strBuilder.toString());
}
return line;
}
private void itera(int k,int n, int[][] grid, List<List<String>> list){
if(k == n){
list.add(generateList(grid));
return ;
}
for(int i=0; i<n; i++){
if(isRight(grid, k, i, n)){
grid[k][i] =1;
itera(k+1, n, grid, list);
grid[k][i]=0;
}
}
}
public List<List<String>> solveNQueens(int n) {
int[][] grid =new int[n][n];
List<List<String>> list = new LinkedList<>();
if(n !=0){
itera(0, n, grid, list);
}
return list;
}
}
时间复杂度O(N^2), 空间复杂度为O(N^2)。