//8皇后问题
public class Queen8 {
//表示皇后个数
private static int max = 8;
//用一维数组表示棋盘
//例:arr[i] = 5 ——> i表示第i + 1行(第i + 1个皇后),5表示第5 + 1列,来表示该皇后的位置
private static int[] arr = new int[max];
//表示第几种结果
private static int count = 0;
public static void main(String[] args) {
setQueen(0);
}
//向数组中放第n个皇后
public static void setQueen(int n) {
if (n == max) { //n == max表示所有的皇后都已经放入
//打印这种结果
print();
return;
}
//将当前皇后在这一行中的每个位置存放,查看是否合理
for (int i = 0; i < max; i++) {
//第n个皇后,放置在第n行的第i列
arr[n] = i;
//判断是否合理
if (checkConflict(n)) {
//合理,开始放置下一个皇后
setQueen(n + 1);
}
//不合理,就放入下一列
}
}
/**
* 检测第n个皇后与之前摆放的皇后是否冲突
* @param n n表示第n个皇后,皇后从0开始
* @return true表示不冲突,false表示冲突
*/
public static boolean checkConflict(int n) {
//循环遍历n之前的皇后
for (int i = 0; i < n; i++) {
//1.如果在同一列,则冲突——> arr[i] = arr[n]
//2.如果在同一斜线,则冲突——> Math.abs(arr[i] - arr[n]) == Math.abs(i - n)
//Math.abs表示获取绝对值
//二维数组中,如果两个点行坐标的差和列坐标的差相等,则表示在统一条斜线上
//i - n表示行的差,arr[i] - arr[n]表示列的差
//3.如果在同一行,则冲突——> 因为第n个皇后就在第n行所以不会出现在同一行的问题
if (arr[i] == arr[n] || Math.abs(arr[i] - arr[n]) == Math.abs(i - n)) {
return false;
}
}
return true;
}
//打印数组
private static void print() {
System.out.printf("第%d种结果:", ++count);
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
}
从B站韩顺平老师的Java数据结构与算法习得。