我这是一个简短的4个皇后的摆放问题,这样的摆法是有2种的. 还需要多多理解这个递归回溯的思路. 真的太抽象了.
解决写递归的思路,就是我只要写出来种可能的摆放, 剩下的问题就是在我这种可能摆放的基础上进行递增.
package Recursion;
import java.util.Arrays;
/**
* @author ct_start
* @create 2021 -08 -27
**/
// 八皇后问题
public class Recursion05 {
// 使用一维数组来代表八皇后摆放的位置
static int arr[] = new int[4];
public static void main(String[] args) {
// 递归的终止条件怎么写
check(0);
}
private static void show (){
System.out.println(Arrays.toString(arr));
}
// 还得写一个方法来放置第n个皇后
// 回溯在哪里呀
public static void check(int n){
if (n==4){ // n=8 代表的是第九个皇后,其实前面8个已经放好了
show(); // 直接把这个结果输出
return;
}
// 依次放,并判断是否冲突
for (int i = 0; i < 4; i++) {
// 先把当前这个皇后n, 放到该行的第一列
arr[n]=i;
// 判断这个第n 个皇后的位置是否冲突
if (isTrue(n)){
check(n+1);
}
// 如果冲突就执行array[n]
}
}
// 重点问题 : 递归的终止条件 ② 和什么时候放在什么位置是不能满足这个位置的摆放的结果
// 写一个方法来判断该皇后摆放的位置是否合法
// n 表示传进来的第几个
public static boolean isTrue (int n){
// n 代表的是第几个传进来的皇后
// 如何判断是否是在在同一列 和 同一斜线上
// 判断是否是同一行没有必要判断 ,因为n 就是代表不同的行
for (int i = 0; i < n; i++) {
if (arr[n]==arr[i]|| Math.abs(n-i)==Math.abs(arr[n]-arr[i])){ // 这里老师写的是 Math.abs(n-i)==Math.abs(arr[n]-arr[i])
return false;
}
}
return true;
}
// 编写一个方法打印数组
}