用遞歸回溯解決八皇后問題
阿新 • • 發佈:2021-01-16
思想
理論上應該建立一個二維陣列來表示棋盤,但是實際上可以通過演算法,用一個一維陣列即可解決問題. arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3}
arr 下標表示第幾行,即第幾個皇后;
arr[i] = val , val 表示第 i+1個皇后,放在第 i+1行的第 val+1 列;
程式碼實現
// 遞迴解決八皇后問題
public class EightQueen {
int maxSize = 8;
int[] array = new int[maxSize];
int count = 1;
public static void main(String[] args) {
EightQueen eightQueen = new EightQueen();
eightQueen.check(0);
}
// 放置棋子的方法
private void check(int n){
if (n == maxSize){
printChess();
return;
}else {
for (int i = 0; i < maxSize; i++) {
// 先把旗子放在該行第一列
array[n] = i;
// 判斷是否合法
if (judge(n)){
// 如果合法,放置下一個
check(n+1);
}
//如果不合法,無操作,繼續判斷 array[n] = i+1 的情況;
}
}
}
// 判斷第n個棋子放下後是否合規
private boolean judge(int n){
for (int i = 0; i < n; i++) {
// 如果在同一列或者在同一斜線,返回false
// Math.abs(n-i) == Math.abs(array[n] - array[i])的簡單理解 :
// (n-i)是錯開了多少行,(array[n] - array[i])是錯開了多少列,錯開的行和列的絕對值相等,說明在同一斜線上
if (array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
return false;
}
}
return true;
}
// 列印方法
private void printChess(){
System.out.printf("第%d種方式\n",count);
for (int i : array) {
System.out.print(i+"\t");
}
System.out.println();
count++;
}
}