1. 程式人生 > 其它 >用遞歸回溯解決八皇后問題

用遞歸回溯解決八皇后問題

技術標籤:演算法學習學習筆記演算法資料結構

思想

在這裡插入圖片描述
理論上應該建立一個二維陣列來表示棋盤,但是實際上可以通過演算法,用一個一維陣列即可解決問題. 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++; } }