八皇后問題暴力解決法(介紹代碼有說明)
先展示結果:
我這裏用的是一維數組來展示的結果
array={7,3,0,2,5,1,6,4}
7的下標爲0, 在這裏下標+1表示的是第幾個皇后也是行的位置,array[n]+1的值就是皇后所在列的位置,即:
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1
下面是代碼演示:
//定義一個max表示一共有多少皇后
int max = 8;
static int all = 0;
//定義數組,保存皇后放置後位置的結果,比如arr={0,1,2,3,4,5,6,7}
int[] array = new int[max];
public static void main(String[] args) {
//測試
Queue8 queue8 = new Queue8();
queue8.check(0);
System.out.println(all);
}
//特別注意!!!
//每一個check都有for (int i =0; i < max; i++)因此會出現回溯
private void check(int n){
if (n == max){
print();
return;
}
//一次放入皇后判斷是否衝突
for (int i =0; i < max; i++){
//先吧當前皇后放到第1列
array[n] = i;
//判斷放置第n個皇后到i列時,是否衝突
if (judge(n)){ //不衝突
//接着放置第n個皇后 遞歸開始
check(n+1);
}
//如果衝突就繼續執行array[n] = i;即將第n個皇后,放置在本行的後移一個位置
}
}
/**
* 判斷是否符合位置
* @param n 表示第幾個皇后
* @return 是否
*/
private boolean judge(int n){
for (int i = 0; i < n; i++){
//說明
//1.array[i] == array[n] 表示判斷第n個皇后是否與n-1個皇后處於同一列
//2.Math.abs(n - i) == Math.abs(array[n] - array[i]) 表示判斷第n個皇后是否處於第i個皇后的同一斜線
if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])){
return false;
}
}
return true;
}
//寫一個方法,可以將皇后位置擺放輸出
private void print(){
for (int i = 0; i < array.length; i++){
System.out.printf(array[i] + " ");
}
all++;
System.out.println();
}