之前两篇文章介绍了一种思想的解法,不过之前的解法主要是解决全排列问题的,而八皇后问题其实还有另一种解法,这是目前我知道的最简单的解法,之前的思想是验证整个排列的数组而本章算法的思想是一个一个往里放,边放边验证这个位置是否可行,如果可行进入递归验证下一位,如果放到了最后一个位置下一位,说明上一个位置已成功,此时的n如果为8即可退出递归并把计数器加一,如果该位置不能放置,则会跳过该位置继续判断。
代码如下:
public class QueenDemo {
public static void main(String[] args) {
int[] arr=new int[9];//多出一个位置存结果
//思想:一个一个往里放
check(arr,0);
System.out.println(arr[8]);
}
public static void check(int[] arr,int n){
if(n==arr.length-1){
arr[arr.length-1]++;
return;
}
for (int i = 0; i < arr.length-1; i++) {
arr[n]=i;
if(jud(arr,n)){
check(arr,n+1);//不冲突就继续放下一个
}
}
}
public static boolean jud(int[] arr,int n){
for (int i = 0; i < n; i++) {
if(arr[i]==arr[n]||Math.abs(i-n)==Math.abs(arr[i]-arr[n])){
return false;
}
}
return true;
}
}