前言
在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题
一、代码示例
经过测试,总共有92种解法
public class qwe {
// max X max 的正方形
private final int max = 8;
// 数组 用于存放皇后的坐标,第n 个皇后代表第几行上面的皇后
private int[] arr = new int[max];
// 解法总数
private int count;
public static void main(String[] args) {
qwe qwe = new qwe();
qwe.check(0);
}
public void check(int n) {
if (n == max) {
print();
++count;
System.out.println(count);
return;
}
// 使用递归遍历出所有可能
for (int i = 0; i < max; i++) {
arr[n] = i;
if (judge(n)) {
check(n + 1);
}
}
}
/**
* 判断第n 个皇后是否与前面的冲突
*
* @param n
* @return
*/
public boolean judge(int n) {
for (int i = 0; i < n; i++) {
// 判断第n 个皇后是否与第i 个皇后在同一列或者同一对角线上
if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[i] - arr[n])) {
return false;
}
}
return true;
}
/**
* 打印服务
*/
public void print() {
StringBuilder s = new StringBuilder();
for (int i : arr) {
s = s.append(arr[i] + ",");
}
System.out.println(s.toString());
}
}
总结
加油噢!