What
n 皇后问题, 即每一个皇后上下左右,对角线上都不能有其他的皇后存在
解题思路
- 上下左右,只有当第二个以上的皇后,只要
col
没有其他皇后即可 - 对角线上不能有其他皇后,遍历之前的皇后,之间的坐标的斜率的模不为1即可
|(colX - colY) / (rowX - rowY)| != 1
Code
package cn.derry.chapter5;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
/**
* @author MangoDai
* @decription 八皇后问题
* @date 2017/11/8
**/
public class Estimate {
private static int n = 0;
private volatile static int count = 0;
/**
* 描述 要求没有米字
*
* @param args
*/
public static void main(String[] args) {
// n = new Random().nextInt(20) + 5;
n = 12;
rebackTrace(n);
}
private static int[] s = null;
private static void rebackTrace(int n) {
// 从第一行开始
int[] arr = new int[n + 1];
// 开始处理
reback(arr, 1);
System.out.println("count = " + count);
}
private static void reback(int[] arr, int k) {
if (k > n) {
count++;
System.out.println(count + "恭喜你成功了 arr = " + Arrays.toString(arr));
return;
} else {
// 从第一行开始
if (k == 1) {
// 第一行依次递归回去 1 - n
for (int i = 1; i <= n; i++) {
// 取第一行的 第 i 个
arr[k] = i;
// System.out.println();
// System.out.println("第 " + k + " 取 = " + i);
reback(arr, k + 1);
}
} else {
// 给k行开始,取第k行的 1 - n
for (int i = 1; i <= n; i++) {
boolean flag = false;
// 从1 - k 取过的值,判断该行是否可以
for (int j = 1; j < k; j++) {
// 上方取得值行该行正好相同
if (arr[j] == i) {
flag = true;
break;
}
// 斜角不可以有节点
// 公式 列 / 行
double divid = (double) (arr[j] - i) / (double) (j - k);
divid = Math.abs(divid);
if (divid == 1) {
flag = true;
break;
}
}
// 如果k行的i列可以就赋值
if (!flag) {
arr[k] = i;
// System.out.println("第 " + k + " 取 = " + i);
reback(arr, k + 1);
} else {
// System.out.println("第 " + k + " 不可以取值 " + i);
}
}
}
}
}
}