题目
对于一个n*n的棋盘,给定n个皇后,求每个皇后的位置,其中要求每个皇后在八个方向上是唯一存在的
思路
对n*n的棋盘使用图的深度优先收索求解,注意剪枝
代码
import java.util.ArrayList;
/**
* 对于一个n*n的棋盘,给定n个皇后,求每个皇后的位置,其中要求每个皇后在八个方向上是唯一存在的
*/
public class NQueue {
public static void main(String[] args) {
int n = 8;// 皇后的数量
int[] queen = new int[n];// queen[i]=j表示第i个皇后占据第j列
//结果集
ArrayList<String> res = new ArrayList<String>();
int[] a0 = new int[2 * n]; // 记录45度对角线是否皇后
int[] a1 = new int[2 * n]; // 记录-45度对角线是否皇后
int[] colum = new int[n]; //记录第j列是否皇后
f1(res, queen, colum, a0, a1, 0);
System.out.println("共有:"+res.size()+"种不同方案
\n分别为:");
for (int i = 0; i < res.size(); i++) {
System.out.println(res.get(i));
}
}
// row表示为第row个皇后
private static void f1(ArrayList<String> res, int[] queen, int[] colum,
int[] a0, int[] a1, int row) {
if (row == queen.length) {
// 找到结果
StringBuffer s = new StringBuffer();
for (int i = 0; i < queen.length; i++) {
s.append(queen[i] + " ");
}
res.add(s.toString());
return;
}
for (int j = 0; j < queen.length; j++) {
if (!isOccupy(queen, colum, a0, a1, row, j)) {
continue;
}
// 先占位,再判断是否符合题意
queen[row] = j;
update(colum, a0, a1, row, j, 1);
f1(res, queen, colum, a0, a1, row + 1);
// queen[row] = j;不满足题意,则回溯
queen[row] = 0;
update(colum, a0, a1, row, j, 0);
}
}
private static void update(int[] colum, int[] a0, int[] a1, int row, int j,
int value) {
colum[j] = value;
a0[row + j] = value;
a1[row - j + colum.length - 1] = value;
}
private static boolean isOccupy(int[] queen, int[] colum, int[] a0,
int[] a1, int row, int j) {
return queen[row] == 0 && colum[j] == 0 && a0[row + j] == 0
&& a1[row - j + colum.length - 1] == 0;
}
}
结果:
共有:92 种不同方案
分别为:
0 4 7 5 2 6 1 3
0 5 7 2 6 3 1 4
0 6 3 5 7 1 4 2
0 6 4 7 1 3 5 2
1 3 5 7 2 0 6 4
1 4 6 0 2 7 5 3
1 4 6 3 0 7 5 2
1 5 0 6 3 7 2 4
1 5 7 2 0 3 6 4
1 6 2 5 7 4 0 3
1 6 4 7 0 3 5 2
1 7 5 0 2 4 6 3
2 0 6 4 7 1 3 5
2 4 1 7 0 6 3 5
2 4 1 7 5 3 6 0
2 4 6 0 3 1 7 5
2 4 7 3 0 6 1 5
2 5 1 4 7 0 6 3
2 5 1 6 0 3 7 4
2 5 1 6 4 0 7 3
2 5 3 0 7 4 6 1
2 5 3 1 7 4 6 0
2 5 7 0 3 6 4 1
2 5 7 0 4 6 1 3
2 5 7 1 3 0 6 4
2 6 1 7 4 0 3 5
2 6 1 7 5 3 0 4
2 7 3 6 0 5 1 4
3 0 4 7 1 6 2 5
3 0 4 7 5 2 6 1
3 1 4 7 5 0 2 6
3 1 6 2 5 7 0 4
3 1 6 2 5 7 4 0
3 1 6 4 0 7 5 2
3 1 7 4 6 0 2 5
3 1 7 5 0 2 4 6
3 5 0 4 1 7 2 6
3 5 7 1 6 0 2 4
3 5 7 2 0 6 4 1
3 6 0 7 4 1 5 2
3 6 2 7 1 4 0 5
3 6 4 1 5 0 2 7
3 6 4 2 0 5 7 1
3 7 0 2 5 1 6 4
3 7 0 4 6 1 5 2
3 7 4 2 0 6 1 5
4 0 3 5 7 1 6 2
4 0 7 3 1 6 2 5
4 0 7 5 2 6 1 3
4 1 3 5 7 2 0 6
4 1 3 6 2 7 5 0
4 1 5 0 6 3 7 2
4 1 7 0 3 6 2 5
4 2 0 5 7 1 3 6
4 2 0 6 1 7 5 3
4 2 7 3 6 0 5 1
4 6 0 2 7 5 3 1
4 6 0 3 1 7 5 2
4 6 1 3 7 0 2 5
4 6 1 5 2 0 3 7
4 6 1 5 2 0 7 3
4 6 3 0 2 7 5 1
4 7 3 0 2 5 1 6
4 7 3 0 6 1 5 2
5 0 4 1 7 2 6 3
5 1 6 0 2 4 7 3
5 1 6 0 3 7 4 2
5 2 0 6 4 7 1 3
5 2 0 7 3 1 6 4
5 2 0 7 4 1 3 6
5 2 4 6 0 3 1 7
5 2 4 7 0 3 1 6
5 2 6 1 3 7 0 4
5 2 6 1 7 4 0 3
5 2 6 3 0 7 1 4
5 3 0 4 7 1 6 2
5 3 1 7 4 6 0 2
5 3 6 0 2 4 1 7
5 3 6 0 7 1 4 2
5 7 1 3 0 6 4 2
6 0 2 7 5 3 1 4
6 1 3 0 7 4 2 5
6 1 5 2 0 3 7 4
6 2 0 5 7 4 1 3
6 2 7 1 4 0 5 3
6 3 1 4 7 0 2 5
6 3 1 7 5 0 2 4
6 4 2 0 5 7 1 3
7 1 3 0 6 4 2 5
7 1 4 2 0 6 3 5
7 2 0 5 1 4 6 3
7 3 0 2 5 1 6 4