一、问题描述
有一个 8 * 8 的棋盘,和 8 个皇后,皇后的攻击规则:任意一个皇后可以攻击同一行、同一列、正反对角线上的皇后。问题:如何摆放8个皇后,可以让她们互相不攻击。
提示:一行或一列只能放一个皇后。
二、解题思路
采用深度优先遍历方式,从第0行开始,逐行查看每一列中那些位置可以摆放皇后,也就是每一行需要扫描8列,而且还需要判断当前位置和摆放过皇后的位置是否符合规则。
三、DFS(深度优先搜索)
套路:
// 参数n:问题规模
void dfs(int n){
// dfs 出口
if(){
...
return;
}
// dfs body
处理当前内容
// dfs 递归
处理当前内容与子问题的关系
}
二叉树遍历
package com.daxiong.day6;
/**
* 1
* 2 3
* 4 5 6 7
* */
public class TowTree {
private static int[] tree = {0,1,2,3,4,5,6,7}; // 第0为站位,不参与实际问题
public static void main(String[] args) {
dfs(1);
}
// 二叉树前序遍历
public static void dfs(int root){
if(root*2 >= 8){
System.out.println(tree[root]);
return;
}
System.out.println(tree[root]);
dfs(root*2); // 左子树
dfs(root*2+1); // 右子树
}
}
四、代码实现
package com.daxiong.day6;
/**
* 8 皇后问题
* */
public class EightQueen {
// 8 个皇后
private static int SIZE = 8;
// 存放规则:索引(0-7)表示行,索引对应的值(0-8)表示该行可以存放皇后的列值,以此构建一个类似二位数组
private static int[] queen = new int[SIZE];
// 方案数
private static int step = 0;
public static void main(String[] args) {
dfs(0);
}
/**
* @fun 判断当前行可以存放皇后的列
* @param key : 当前行(可以看作坐标中的 X1)
* @param value : 当前行对应的列值(可以看作坐标中X1对应的值Y1)
* @return : 当前行对应的列是否可以存放皇后
*/
public static boolean isOk(int key, int value) {
for (int i = 0; i < key; i++) {
if (i == key || queen[i] == value || (i - key == queen[i] - value) || (key - i == queen[i] - value)) {
return false;
}
}
return true;
}
/**
* @fun dfs,深度遍历递归函数
* @param row : 行扫描,问题规模
*/
public static void dfs(int row) {
if (row == SIZE) {
step++;
print(step);
return;
}
for (int i = 0; i < SIZE; i++) {
if (isOk(row, i)) {
queen[row] = i;
dfs(row + 1);
}
}
}
/**
* @fun 打印 8 皇后可行方案
* @param step : 第几个方案
*/
public static void print(int step) {
System.out.println("方案(" + step + "):");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (queen[i] == j) { // 皇后位置
System.out.print(" @ ");
} else { // 非皇后
System.out.print(" * ");
}
}
System.out.println();
}
}
}
五、答案
共有 92 中方案:
方案(1):
@ * * * * * * *
* * * * @ * * *
* * * * * * * @
* * * * * @ * *
* * @ * * * * *
* * * * * * @ *
* @ * * * * * *
* * * @ * * * *
方案(2):
@ * * * * * * *
* * * * * @ * *
* * * * * * * @
* * @ * * * * *
* * * * * * @ *
* * * @ * * * *
* @ * * * * * *
* * * * @ * * *
方案(3):
@ * * * * * * *
* * * * * * @ *
* * * @ * * * *
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
* * * * @ * * *
* * @ * * * * *
方案(4):
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
* * * * * @ * *
* * @ * * * * *
方案(5):
* @ * * * * * *
* * * @ * * * *
* * * * * @ * *
* * * * * * * @
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
方案(6):
* @ * * * * * *
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
* * * * * * * @
* * * * * @ * *
* * * @ * * * *
方案(7):
* @ * * * * * *
* * * * @ * * *
* * * * * * @ *
* * * @ * * * *
@ * * * * * * *
* * * * * * * @
* * * * * @ * *
* * @ * * * * *
方案(8):
* @ * * * * * *
* * * * * @ * *
@ * * * * * * *
* * * * * * @ *
* * * @ * * * *
* * * * * * * @
* * @ * * * * *
* * * * @ * * *
方案(9):
* @ * * * * * *
* * * * * @ * *
* * * * * * * @
* * @ * * * * *
@ * * * * * * *
* * * @ * * * *
* * * * * * @ *
* * * * @ * * *
方案(10):
* @ * * * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * @ * *
* * * * * * * @
* * * * @ * * *
@ * * * * * * *
* * * @ * * * *
方案(11):
* @ * * * * * *
* * * * * * @ *
* * * * @ * * *
* * * * * * * @
@ * * * * * * *
* * * @ * * * *
* * * * * @ * *
* * @ * * * * *
方案(12):
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
@ * * * * * * *
* * @ * * * * *
* * * * @ * * *
* * * * * * @ *
* * * @ * * * *
方案(13):
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
* * * * * @ * *
方案(14):
* * @ * * * * *
* * * * @ * * *
* @ * * * * * *
* * * * * * * @
@ * * * * * * *
* * * * * * @ *
* * * @ * * * *
* * * * * @ * *
方案(15):
* * @ * * * * *
* * * * @ * * *
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
* * * @ * * * *
* * * * * * @ *
@ * * * * * * *
方案(16):
* * @ * * * * *
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
方案(17):
* * @ * * * * *
* * * * @ * * *
* * * * * * * @
* * * @ * * * *
@ * * * * * * *
* * * * * * @ *
* @ * * * * * *
* * * * * @ * *
方案(18):
* * @ * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * @ * * *
* * * * * * * @
@ * * * * * * *
* * * * * * @ *
* * * @ * * * *
方案(19):
* * @ * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * * * @ *
@ * * * * * * *
* * * @ * * * *
* * * * * * * @
* * * * @ * * *
方案(20):
* * @ * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * * * @ *
* * * * @ * * *
@ * * * * * * *
* * * * * * * @
* * * @ * * * *
方案(21):
* * @ * * * * *
* * * * * @ * *
* * * @ * * * *
@ * * * * * * *
* * * * * * * @
* * * * @ * * *
* * * * * * @ *
* @ * * * * * *
方案(22):
* * @ * * * * *
* * * * * @ * *
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
方案(23):
* * @ * * * * *
* * * * * @ * *
* * * * * * * @
@ * * * * * * *
* * * @ * * * *
* * * * * * @ *
* * * * @ * * *
* @ * * * * * *
方案(24):
* * @ * * * * *
* * * * * @ * *
* * * * * * * @
@ * * * * * * *
* * * * @ * * *
* * * * * * @ *
* @ * * * * * *
* * * @ * * * *
方案(25):
* * @ * * * * *
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
方案(26):
* * @ * * * * *
* * * * * * @ *
* @ * * * * * *
* * * * * * * @
* * * * @ * * *
@ * * * * * * *
* * * @ * * * *
* * * * * @ * *
方案(27):
* * @ * * * * *
* * * * * * @ *
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
* * * @ * * * *
@ * * * * * * *
* * * * @ * * *
方案(28):
* * @ * * * * *
* * * * * * * @
* * * @ * * * *
* * * * * * @ *
@ * * * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * @ * * *
方案(29):
* * * @ * * * *
@ * * * * * * *
* * * * @ * * *
* * * * * * * @
* @ * * * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * @ * *
方案(30):
* * * @ * * * *
@ * * * * * * *
* * * * @ * * *
* * * * * * * @
* * * * * @ * *
* * @ * * * * *
* * * * * * @ *
* @ * * * * * *
方案(31):
* * * @ * * * *
* @ * * * * * *
* * * * @ * * *
* * * * * * * @
* * * * * @ * *
@ * * * * * * *
* * @ * * * * *
* * * * * * @ *
方案(32):
* * * @ * * * *
* @ * * * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * @ * *
* * * * * * * @
@ * * * * * * *
* * * * @ * * *
方案(33):
* * * @ * * * *
* @ * * * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * @ * *
* * * * * * * @
* * * * @ * * *
@ * * * * * * *
方案(34):
* * * @ * * * *
* @ * * * * * *
* * * * * * @ *
* * * * @ * * *
@ * * * * * * *
* * * * * * * @
* * * * * @ * *
* * @ * * * * *
方案(35):
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
* * * * * @ * *
方案(36):
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
@ * * * * * * *
* * @ * * * * *
* * * * @ * * *
* * * * * * @ *
方案(37):
* * * @ * * * *
* * * * * @ * *
@ * * * * * * *
* * * * @ * * *
* @ * * * * * *
* * * * * * * @
* * @ * * * * *
* * * * * * @ *
方案(38):
* * * @ * * * *
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
* * * * @ * * *
方案(39):
* * * @ * * * *
* * * * * @ * *
* * * * * * * @
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
* @ * * * * * *
方案(40):
* * * @ * * * *
* * * * * * @ *
@ * * * * * * *
* * * * * * * @
* * * * @ * * *
* @ * * * * * *
* * * * * @ * *
* * @ * * * * *
方案(41):
* * * @ * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * * * @
* @ * * * * * *
* * * * @ * * *
@ * * * * * * *
* * * * * @ * *
方案(42):
* * * @ * * * *
* * * * * * @ *
* * * * @ * * *
* @ * * * * * *
* * * * * @ * *
@ * * * * * * *
* * @ * * * * *
* * * * * * * @
方案(43):
* * * @ * * * *
* * * * * * @ *
* * * * @ * * *
* * @ * * * * *
@ * * * * * * *
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
方案(44):
* * * @ * * * *
* * * * * * * @
@ * * * * * * *
* * @ * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * * * @ *
* * * * @ * * *
方案(45):
* * * @ * * * *
* * * * * * * @
@ * * * * * * *
* * * * @ * * *
* * * * * * @ *
* @ * * * * * *
* * * * * @ * *
* * @ * * * * *
方案(46):
* * * @ * * * *
* * * * * * * @
* * * * @ * * *
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
* @ * * * * * *
* * * * * @ * *
方案(47):
* * * * @ * * *
@ * * * * * * *
* * * @ * * * *
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
* * * * * * @ *
* * @ * * * * *
方案(48):
* * * * @ * * *
@ * * * * * * *
* * * * * * * @
* * * @ * * * *
* @ * * * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * @ * *
方案(49):
* * * * @ * * *
@ * * * * * * *
* * * * * * * @
* * * * * @ * *
* * @ * * * * *
* * * * * * @ *
* @ * * * * * *
* * * @ * * * *
方案(50):
* * * * @ * * *
* @ * * * * * *
* * * @ * * * *
* * * * * @ * *
* * * * * * * @
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
方案(51):
* * * * @ * * *
* @ * * * * * *
* * * @ * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * * * @
* * * * * @ * *
@ * * * * * * *
方案(52):
* * * * @ * * *
* @ * * * * * *
* * * * * @ * *
@ * * * * * * *
* * * * * * @ *
* * * @ * * * *
* * * * * * * @
* * @ * * * * *
方案(53):
* * * * @ * * *
* @ * * * * * *
* * * * * * * @
@ * * * * * * *
* * * @ * * * *
* * * * * * @ *
* * @ * * * * *
* * * * * @ * *
方案(54):
* * * * @ * * *
* * @ * * * * *
@ * * * * * * *
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
* * * * * * @ *
方案(55):
* * * * @ * * *
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
* * * @ * * * *
方案(56):
* * * * @ * * *
* * @ * * * * *
* * * * * * * @
* * * @ * * * *
* * * * * * @ *
@ * * * * * * *
* * * * * @ * *
* @ * * * * * *
方案(57):
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
* * * * * * * @
* * * * * @ * *
* * * @ * * * *
* @ * * * * * *
方案(58):
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
* * @ * * * * *
方案(59):
* * * * @ * * *
* * * * * * @ *
* @ * * * * * *
* * * @ * * * *
* * * * * * * @
@ * * * * * * *
* * @ * * * * *
* * * * * @ * *
方案(60):
* * * * @ * * *
* * * * * * @ *
* @ * * * * * *
* * * * * @ * *
* * @ * * * * *
@ * * * * * * *
* * * @ * * * *
* * * * * * * @
方案(61):
* * * * @ * * *
* * * * * * @ *
* @ * * * * * *
* * * * * @ * *
* * @ * * * * *
@ * * * * * * *
* * * * * * * @
* * * @ * * * *
方案(62):
* * * * @ * * *
* * * * * * @ *
* * * @ * * * *
@ * * * * * * *
* * @ * * * * *
* * * * * * * @
* * * * * @ * *
* @ * * * * * *
方案(63):
* * * * @ * * *
* * * * * * * @
* * * @ * * * *
@ * * * * * * *
* * @ * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * * * @ *
方案(64):
* * * * @ * * *
* * * * * * * @
* * * @ * * * *
@ * * * * * * *
* * * * * * @ *
* @ * * * * * *
* * * * * @ * *
* * @ * * * * *
方案(65):
* * * * * @ * *
@ * * * * * * *
* * * * @ * * *
* @ * * * * * *
* * * * * * * @
* * @ * * * * *
* * * * * * @ *
* * * @ * * * *
方案(66):
* * * * * @ * *
* @ * * * * * *
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
* * * * @ * * *
* * * * * * * @
* * * @ * * * *
方案(67):
* * * * * @ * *
* @ * * * * * *
* * * * * * @ *
@ * * * * * * *
* * * @ * * * *
* * * * * * * @
* * * * @ * * *
* * @ * * * * *
方案(68):
* * * * * @ * *
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
方案(69):
* * * * * @ * *
* * @ * * * * *
@ * * * * * * *
* * * * * * * @
* * * @ * * * *
* @ * * * * * *
* * * * * * @ *
* * * * @ * * *
方案(70):
* * * * * @ * *
* * @ * * * * *
@ * * * * * * *
* * * * * * * @
* * * * @ * * *
* @ * * * * * *
* * * @ * * * *
* * * * * * @ *
方案(71):
* * * * * @ * *
* * @ * * * * *
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
方案(72):
* * * * * @ * *
* * @ * * * * *
* * * * @ * * *
* * * * * * * @
@ * * * * * * *
* * * @ * * * *
* @ * * * * * *
* * * * * * @ *
方案(73):
* * * * * @ * *
* * @ * * * * *
* * * * * * @ *
* @ * * * * * *
* * * @ * * * *
* * * * * * * @
@ * * * * * * *
* * * * @ * * *
方案(74):
* * * * * @ * *
* * @ * * * * *
* * * * * * @ *
* @ * * * * * *
* * * * * * * @
* * * * @ * * *
@ * * * * * * *
* * * @ * * * *
方案(75):
* * * * * @ * *
* * @ * * * * *
* * * * * * @ *
* * * @ * * * *
@ * * * * * * *
* * * * * * * @
* @ * * * * * *
* * * * @ * * *
方案(76):
* * * * * @ * *
* * * @ * * * *
@ * * * * * * *
* * * * @ * * *
* * * * * * * @
* @ * * * * * *
* * * * * * @ *
* * @ * * * * *
方案(77):
* * * * * @ * *
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
* * * * @ * * *
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
方案(78):
* * * * * @ * *
* * * @ * * * *
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
* * * * @ * * *
* @ * * * * * *
* * * * * * * @
方案(79):
* * * * * @ * *
* * * @ * * * *
* * * * * * @ *
@ * * * * * * *
* * * * * * * @
* @ * * * * * *
* * * * @ * * *
* * @ * * * * *
方案(80):
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
* * @ * * * * *
方案(81):
* * * * * * @ *
@ * * * * * * *
* * @ * * * * *
* * * * * * * @
* * * * * @ * *
* * * @ * * * *
* @ * * * * * *
* * * * @ * * *
方案(82):
* * * * * * @ *
* @ * * * * * *
* * * @ * * * *
@ * * * * * * *
* * * * * * * @
* * * * @ * * *
* * @ * * * * *
* * * * * @ * *
方案(83):
* * * * * * @ *
* @ * * * * * *
* * * * * @ * *
* * @ * * * * *
@ * * * * * * *
* * * @ * * * *
* * * * * * * @
* * * * @ * * *
方案(84):
* * * * * * @ *
* * @ * * * * *
@ * * * * * * *
* * * * * @ * *
* * * * * * * @
* * * * @ * * *
* @ * * * * * *
* * * @ * * * *
方案(85):
* * * * * * @ *
* * @ * * * * *
* * * * * * * @
* @ * * * * * *
* * * * @ * * *
@ * * * * * * *
* * * * * @ * *
* * * @ * * * *
方案(86):
* * * * * * @ *
* * * @ * * * *
* @ * * * * * *
* * * * @ * * *
* * * * * * * @
@ * * * * * * *
* * @ * * * * *
* * * * * @ * *
方案(87):
* * * * * * @ *
* * * @ * * * *
* @ * * * * * *
* * * * * * * @
* * * * * @ * *
@ * * * * * * *
* * @ * * * * *
* * * * @ * * *
方案(88):
* * * * * * @ *
* * * * @ * * *
* * @ * * * * *
@ * * * * * * *
* * * * * @ * *
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
方案(89):
* * * * * * * @
* @ * * * * * *
* * * @ * * * *
@ * * * * * * *
* * * * * * @ *
* * * * @ * * *
* * @ * * * * *
* * * * * @ * *
方案(90):
* * * * * * * @
* @ * * * * * *
* * * * @ * * *
* * @ * * * * *
@ * * * * * * *
* * * * * * @ *
* * * @ * * * *
* * * * * @ * *
方案(91):
* * * * * * * @
* * @ * * * * *
@ * * * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * @ * * *
* * * * * * @ *
* * * @ * * * *
方案(92):
* * * * * * * @
* * * @ * * * *
@ * * * * * * *
* * @ * * * * *
* * * * * @ * *
* @ * * * * * *
* * * * * * @ *
* * * * @ * * *