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

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

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

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

可以使用二維陣列來表示棋盤。然而,由於每一行只能有一個皇后,因此使用一維數組來表示皇后在該行中的位置就足夠了。因此,您可以將 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]刪除
最新教學 更多>
  • JFreeChart如何調整大小以適應我的JPanel?
    JFreeChart如何調整大小以適應我的JPanel?
    如何調整jfreechart 在JPANEL中添加JFReechart可能會導致超大顯示。 To address this issue, there are several options available.When creating the ChartPanel, you can:Accep...
    程式設計 發佈於2025-04-15
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-04-15
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-04-15
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-04-15
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-04-15
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。但是,對於大字符串或使用許多字符串時,這可能是降低的。 利用正則表達式Example UsageConsider a scenario where ...
    程式設計 發佈於2025-04-15
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-04-15
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-04-15
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-04-15
  • Python高效去除文本中HTML標籤方法
    Python高效去除文本中HTML標籤方法
    在Python中剝離HTML標籤,以獲取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    程式設計 發佈於2025-04-15
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-04-15
  • 將C DLL函數導入Go的技巧
    將C DLL函數導入Go的技巧
    使用dllimport equivalent 中,使用CGO和SYSCALL 有多種方法將DLL函數導入GO。一種方法涉及使用CGO軟件包,該軟件包有助於為C代碼創建GO綁定。使用CGO,您可以直接調用DLL函數,就好像它們是GO函數一樣。 另一種方法利用SYSCALL軟件包。這使您可以與系...
    程式設計 發佈於2025-04-15
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. [&​​&&&&&&&&&&&&&&&默元組方法在...
    程式設計 發佈於2025-04-15
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-04-15
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-04-15

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

Copyright© 2022 湘ICP备2022001581号-3