经典的8皇后问题想必大家都知道。
八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
其他的不啰嗦了,直接上代码
package com.zk.datastruct.recursion;
/**
* @Description:
* @ClassName: Queue8
* @Author: ZK
* @Date: 2021/1/30 14:01
* @Version: 1.0
*/
public class Queue8 {
// 表示有多少个皇后
static int max = 8;
// 定义数组arr,比如 arr = {0,4,7,5,2,6,1,3}
static int[] arr = new int[8];
// 表示结果的总数,有多少种摆法
static int count = 0;
public static void main(String[] args) {
check(0);
System.out.println(count);
}
/**
* 摆放8个皇后,从第0个开始摆放,直到摆放到max个为止
* @param n 从第0个开始摆放
*/
public static void check(int n) {
// 8个皇后已经放置完毕
if (n == max) {
count++;
show();
return;
}
// 依次放入皇后,并判断是否发生了冲突
for (int i = 0; i < max; i++) {
// 把当前这个皇后,依次往0-7的位置摆放,判断是否会发生冲突
arr[n] = i;
// 未发生冲突
if (judge(n)) {
// 继续向下摆放下一个皇后
check(n+1);
}
// else,发生了冲突,回到循环头部,将当前这个皇后向后摆放一个位置,继续判断是否冲突
}
}
/**
* 判断放置的第n个皇后,是否和前边已经摆放好的发生了冲突
* @param n 当前摆放的第n个皇后
* @return false:有冲突 true:无冲突
*/
public static boolean judge(int n){
// i表示n前边的第几个皇后
for (int i = 0; i < n; i++) {
// arr[i] == arr[n] 表示同一列是否有冲突
// Math.abs(n-i) == Math.abs(arr[n]-arr[i]) 表示统一斜线上是否有冲突
if (arr[i] == arr[n] || Math.abs(n-i) == Math.abs(arr[n]-arr[i])) {
return false;
}
}
return true;
}
/**
* 皇后的打印展示
*/
public static void show(){
for (int i = 0; i < max; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}