八皇后问题
八皇后问题是典型的递归问题,每一次递归都是放置一个皇后在对应的行上。代码测试结果有92个答案。
可以在代码中加入计数器记数。
package day02;
public class EightQueen {
/**
* 八皇后:一个8*8的棋盘,从第一行开始排皇后, 要求:各个皇后不能在同一列,同一斜线。求所有摆法。 解法:递归思想
*
* @param args
*/
// 最大有max个皇后
int max = 8;
// 定义一维数组,数组的index是行序列,数组的值是列序号
int[] array = new int[max];
// 输出数组
private void arrprint() {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println("");// 换行
}
// 检测数组是否冲突
// array[i] == array[n] 是否在同一行,
// Math.abs(n-i) == Math.abs(array[i]-array[n]是否在同一斜线
private boolean judge(int n) {
for (int i = 0; i < n; i++) {
if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[i] - array[n])) {
return false;
}
}
return true;
}
// 回溯,放置第哪个皇后
private void check(int n) {
if (n == max) {
arrprint();
return;
}
// 依次放入,开始递归
for (int i = 0; i < max; i++) {
array[n] = i;// 放置第n个皇后的位置为 i
// 判断放置后,是否冲突 chongtu false
if (judge(n)) {
check(n + 1);//回溯
}
//冲突继续执行array[n] = i ;
}
}
public static void main(String[] args) {
EightQueen queen = new EightQueen();
queen.check(0);
//输出结果的每一行都是一个答案
}
}