」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用回溯法解決八皇后問題

使用回溯法解決八皇后問題

發佈於2024-11-02
瀏覽:281

八皇后問題是找到一個解決方案,在棋盤的每一行放置一個皇后,使得兩個皇后不能互相攻擊。該問題可以使用遞歸來解決。在本節中,我們將介紹一種常見的演算法設計技術,稱為回溯來解決這個問題。回溯方法逐步搜尋候選解決方案,一旦確定
就放棄該選項 候選方案不可能是有效的解決方案,然後尋找新的候選方案。

可以使用二維陣列來表示棋盤。然而,由於每一行只能有一個皇后,因此使用一維數組來表示皇后在該行中的位置就足夠了。因此,您可以將 queens 陣列定義為:

int[] 皇后 = new int[8];

j賦值給queens[i],表示在行i和列j中放置一個皇后。下圖(a)顯示了下圖(b)棋盤的queens陣列的內容。

Image description

搜尋從 k = 0 的第一行開始,其中 k 是正在考慮的當前行的索引。此演算法檢查是否可以按 _j = 0, 1, ... , 7 的順序將皇后放置在行中的第 j_ 列中。搜尋實現如下:

  • 如果成功,它將繼續在下一行中搜尋皇后的位置。如果當前行是最後一行,則找到解決方案。
  • 如果不成功,則回溯到上一行,並繼續在上一行的下一列中搜尋新的展示位置。
  • 如果演算法回溯到第一行並且無法在該行找到皇后的新位置,則無法找到解決方案。

下面的程式碼給出了顯示八皇后問題解決方案的程式。

package application;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;

public class EightQueens extends Application {
    public static final int SIZE = 8; // The size of the chess board
    // queens are placed at (i, queens[i])
    // -1 indicates that no queen is currently placed in the ith row
    // Initially, place a queen at (0, 0) in the 0th row
    private int[] queens = {-1, -1, -1, -1, -1, -1, -1, -1};

    @Override // Override the start method in the Application class
    public void start(Stage primaryStage) {
        search(); // Search for a solution

        // Display chess board
        GridPane chessBoard = new GridPane();
        chessBoard.setAlignment(Pos.CENTER);
        Label[][] labels = new Label[SIZE][SIZE];
        for(int i = 0; i = 0 && k 



程式呼叫search()(第20行)來搜尋解決方案。最初,任何行中都沒有放置皇后(第 16 行)。現在,搜尋從第一行 k = 0(第 53 行)開始,並找到皇后的位置(第 56 行)。如果成功,請將其放入該行(第 61 行)並考慮下一行(第 62 行)。如果不成功,則回溯到上一行(第 58-59 行)。

findPosition(k) 方法在從 queen[k] 1 開始的行 k 中搜尋放置皇后的可能位置(第 73 行) 。它檢查是否可以將皇后放置在 start, start 1, 處。 。 。 、7,依此順序(第 75-78 行)。如果可能,返回列索引(第77行);否則,返回 -1(第 80 行)。

調用isValid(row, column)方法檢查在指定位置放置皇后是否會與先前放置的皇后發生衝突(第76行)。它確保沒有皇后被放置在同一列(第86行)、左上角對角線(第87行)或右上角對角線(第88行),如下圖所示。

Image description

版本聲明 本文轉載於:https://dev.to/paulike/solving-the-eight-queens-problem-using-backtracking-25cc?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3