【LeetCode】51.N-Queens(hard)解题报告
题目地址:https://leetcode.com/problems/n-queens/description/
题目描述:
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..”]
]
Solution:
//time:O(n*n)
//space:O(n)
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList<>();
if(n<=0) return res;
helper(res,new int[n],0);
return res;
}
public void helper(List<List<String>> res,int[] queens,int pos){ //queen代表放的这一行的元素在哪一列上queens:[1,3,0,2];pos指行
if(pos == queens.length){
addSolution(res,queens);
return;
}
for(int i=0 ; i<queens.length ; i++){
queens[pos] = i;
if(isValid(queens,pos)){
helper(res,queens,pos+1);
}
}
}
public boolean isValid(int[] queens,int pos){
for(int i=0;i<pos;i++){
if(queens[pos] == queens[i]){ //同一列
return false;
}else if(Math.abs(queens[pos] - queens[i]) == Math.abs(pos - i)){ //对角线
return false;
}
}
return true;
}
public void addSolution(List<List<String>> res,int[] queens){
List<String> list = new ArrayList<>();
for(int i=0 ; i<queens.length ; i++){
StringBuilder sb = new StringBuilder();
for(int j=0 ; j<queens.length ; j++){
if(queens[i] == j){
sb.append('Q');
}else{
sb.append('.');
}
}
list.add(sb.toString());
}
res.add(list);
}
}
Date:2018年1月13日