问题介绍:
解决思路:
/** * 八皇后问题:解决思路:递归 * 1. 第一个皇后先放在第一行第一列 * 2. 第二个皇后放在第二行第一列,然后判断是否合理,如果false,那就继续放在第二列,第三列....一次把所有的列都放完,找到合适的位置为止 * 3. 继续找第三个皇后,还是按照第一列、第二列....一直到第八个皇后也能放在一个不冲突的位置,算是找到一个正确的解法 * 4. 当得到一个正确的解法时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列所有的正确解,全部找到 * 5. 然后回头继续第一个皇后放到第二列,后面的继续循环执行1、2、3、4的步骤 */
递归的调用机制(以一个简单案列为例):
代码实现:
package com.Exer2101.java;
/**
* 八皇后问题:解决思路递归
* 1. 第一个皇后先放在第一行第一列
* 2. 第二个皇后放在第二行第一列,然后判断是否合理,如果false,那就继续放在第二列,第三列....一次把所有的列都放完,找到合适的位置为止
* 3. 继续找第三个皇后,还是按照第一列、第二列....一直到第八个皇后也能放在一个不冲突的位置,算是找到一个正确的解法
* 4. 当得到一个正确的解法时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列所有的正确解,全部找到
* 5. 然后回头继续第一个皇后放到第二列,后面的继续循环执行1、2、3、4的步骤
*/
public class EightQueens {
private int max = 8; //边界
private int []arr = new int[max]; //用一维数组表示。 数组下标+1 ==行数 , 列数为下表对应的数+1
public static int count =0; //用于记录次数
public static int JudgeCount =0;//用于记录判断次数
public static void main(String[] args) {
EightQueens eq = new EightQueens();
eq.check(0);
System.out.printf("总共有%d种",count);
System.out.printf("\n总共判断%d次",JudgeCount);
}
//打印位置
public void print(){
count++;
for(int i=0;i<max;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
//给一个方法,用于放置第n个皇后
public void check(int n){
if(n==max){
print();
return;
}
//如果还未到第八行就继续添加,一共放八个
for(int i=0;i< max;i++){
arr[n] = i;//从每一行的第一个位置开始判断
if(judge(n)){//判断当前皇后的位置
//如果判读为真,那么就说明位置合理,递归继续添加
check(n+1);
}
//如果judge判断的是false,那么就需要执行i++;然后回到arr[n] = i;
// 此时i= i+1,皇后位置向后移
}
}
//首先给一个方法,用于判断第n行的皇后是否位置合理
public boolean judge(int n){
JudgeCount++;
for(int i=0;i<n;i++){
//判读是否在同一列,同一斜线上,如果是就返回false
if(arr[i] ==arr[n]|| Math.abs(n-i)==Math.abs(arr[n]-arr[i])) {
return false;
}
}
return true;
}
}
参考:尚硅谷《数据结构与算法》