1.问题描述
在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
2.思路分析
- 先将第一个皇后放在第一行第一列
- 将第二个皇后放在第二行第一列,判断是否冲突,如果冲突,则放在第三、四......行,直到找到一个不冲突的位置
- 第三个皇后重复上述步骤
- 找到第一个皇后放在第一列的全部解
- 然后再将第一个皇后放在第二、三..... 列
3.代码实现
1.皇后类
package Modules;
/**
* @program: 6.递归的应用
* @description: 皇后类
* @author: Zhou Jian
* @create: 2020-07-15 19:06
*/
public class Queue {
// 统计一共有多少种摆法
public int count = 0;
// 判断冲突的次数
public int WarCount = 0;
// 定义皇后的数量
private int max = 8;
// 定义一个一维数组,用于存放皇后摆放的位置
private int[] Array = new int[max];
// 放入第n个皇后
public void check(int n) {
// 这里的max是8,说明已经摆放好了前8个皇后
if (n == max) {
Show();
return;
}
// 放入第n个皇后,判断是否冲突
for (int i = 0; i < max; i++) {
Array[n] = i; // 将第n个皇后放在i这一列
// 判断放入之后,是否冲突
if(Judge(n)){
check(n+1); // 不冲突则继续放
}
}
}
/**
* 放入第n个皇后,判断是否和前n-1个皇后有冲突
*
* @param n 将要放入的第n个皇后
* @return
*/
public boolean Judge(int n) {
WarCount++;
for (int i = 0; i < n; i++) {
/* 1.将要放入放入的第n个皇后和前面放入的皇后在同一列
2.将要放入放入的第n个皇后和前面放入的皇后在同一斜线
*/
if (Array[i] == Array[n] || Math.abs(n - i) == Math.abs(Array[n] - Array[i]){
return false;
}
}
return true;
}
// 显示矩阵
public void Show() {
count ++;
System.out.println("第" + count + "种摆法是:");
for (int i = 0; i < Array.length; i++) {
System.out.print(Array[i] + "\t");
}
System.out.println();
}
}
2.入口
package Modules;
import java.lang.reflect.Array;
/**
* 做如下规定:
* 这里使用一维数组存储,例如
* int[] Array = {1,2,3,4,5,6,7,8};
* 1 -----> 第1个皇后放在第1行第1列
* 2 -----> 第2个皇后放在第2行第2列
* .................................
* ...............................
* ..............................
* ..........................
*/
public class Main {
// 主方法
public static void main(String[] args) {
Queue q = new Queue();
q.check(0);
System.out.println("一共有:" + q.count + "种结果");
}
}