描述
n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。
给定一个整数n,返回所有不同的n皇后问题的解决方案。
每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。
样例
例1:
输入:1
输出:
[["Q"]]
例2:
输入:4
输出:
[
// Solution 1
[".Q..",
"...Q",
"Q...",
"..Q."
],
// Solution 2
["..Q.",
"Q...",
"...Q",
".Q.."
]
]
深度搜索遍历
import java.util.ArrayList;
import java.util.Scanner;
/**
* N皇后问题
* 深度搜索
* @author qgfzzzzzz
*
*/
public class DFSOfNQueues {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayList<ArrayList<String>> listAll = nQueues(n);
System.out.println(listAll);
}
public static ArrayList<ArrayList<String>> nQueues(int n) {
ArrayList<ArrayList<String>> listAll = new ArrayList<>();
char[][] ch = new char[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
ch[i][j] = '.';
}
}
dfs(0, n, ch, listAll);
return listAll;
}
public static void dfs(int row, int n, char[][] ch, ArrayList<ArrayList<String>> listAll) {
if(row == n) {
ArrayList<String> list = new ArrayList<>();
for(int i = 0; i < n; i++) {
StringBuilder stringBuilder = new StringBuilder();
for(int j = 0; j < n; j++) {
stringBuilder.append(String.valueOf(ch[i][j]));
}
list.add(stringBuilder.toString());
}
listAll.add(list);
return;
}
for(int i = 0; i < n; i++) {
if(isPlace(ch, n, row, i)) {
ch[row][i] = 'Q';
dfs(row + 1, n, ch, listAll);
ch[row][i] = '.';
}
}
}
public static boolean isPlace(char[][] ch, int n, int row, int col) {
for(int i = 0; i < row; i++) {
if(ch[i][col] == 'Q') return false;
if(row + col - i < n && ch[i][row + col - i] == 'Q') return false;
if(col - row + i >= 0 && ch[i][col - row + i] == 'Q') return false;
}
return true;
}
}
非递归
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* N皇后问题
* 非递归
* @author LENOVO
*
*/
public class LoopOfNQueues {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<List<String>> listAll = new ArrayList<List<String>>();
int[] pos = new int[n];
for(int i = 0; i < n; i++) pos[i] = -1;
int row = 0;
while(row >= 0) {
while(++pos[row] < n && !isPlace(pos, row)) {}
if(pos[row] < n) {
if(row == n - 1) {
List<String> list = new ArrayList<>();
for(int i = 0; i < n; i++) {
StringBuilder sBuilder = new StringBuilder();
for(int j = 0; j < n; j++) {
if(pos[i] == j) sBuilder.append("Q");
else sBuilder.append(".");
}
list.add(sBuilder.toString());
}
listAll.add(list);
--row;
}
else {
pos[++row] = -1;
}
}
else row--;
}
System.out.println(listAll);
}
public static boolean isPlace(int[] pos, int row) {
for(int i = 0; i < row; i++) {
if(pos[i] == pos[row] || Math.abs(pos[i] - pos[row]) == row - i) return false;
}
return true;
}
}