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.
Example:
Input: 4
Output: [
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.
题目要求就是 使其两个皇后之间不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
方法一:最简单粗暴的方法 :每一行肯定只有一个皇后,并且在每放置一个皇后 在不能放置皇后的位置上都用.放置 进行遍历
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList<>();
if(n<=0) {
return res;
}
String[][] a =new String[n][n];
getRes(a,res,0,0,n);
return res;
}
public void getRes(String[][] a, List<List<String>> res, int begin, int numQueen, int n) {
if (numQueen == n && n!=0) {
List<String> tmp = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
StringBuffer tmpRes= new StringBuffer();
for (int j = 0; j < a[0].length; j++) {
tmpRes.append(a[i][j]);
}
tmp.add(tmpRes.toString());
}
res.add(tmp);
return;
}
for (int i = 0; i < a[begin].length; i++) {
if(begin == 0) {
a =new String[n][n];
}
if ( ".".equals(a[begin][i])) {
continue;
}
String[][] tmp = new String[n][n];
for (int index = 0; index < a.length; index++) {
for (int j = 0; j < a[0].length; j++) {
tmp[index][j] = a[index][j];
}
}
tmp[begin][i] = "Q";
//同一横线都除此之外都改为.
int k=0;
while(k<tmp[begin].length) {
if(k != i) {
tmp[begin][k] = ".";
}
k++;
}
//同一竖线都除此之外都改为.
k=0;
while(k<tmp.length) {
if(k != begin) {
tmp[k][i] = ".";
}
k++;
}
int tmpA= begin;
int tmpB= i;
while(--tmpA>=0 && --tmpB>=0) {
tmp[tmpA][tmpB]=".";
}
tmpA= begin;
tmpB= i;
while(++tmpA<n && ++tmpB<n) {
tmp[tmpA][tmpB]=".";
}
tmpA= begin;
tmpB= i;
while(++tmpA<n && --tmpB>=0) {
tmp[tmpA][tmpB]=".";
}
tmpA= begin;
tmpB= i;
while(--tmpA>=0 && ++tmpB<n) {
tmp[tmpA][tmpB]=".";
}
getRes(tmp,res,begin+1,numQueen+1,n);
}
}
方法二:依次放置每行的皇后。在放置的时候,要保持当前的状态为合法,即当前放置位置的同一行、同一列、两条对角线上都不存在皇后。