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

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

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

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

可以使用二維陣列來表示棋盤。然而,由於每一行只能有一個皇后,因此使用一維數組來表示皇后在該行中的位置就足夠了。因此,您可以將 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]刪除
最新教學 更多>
  • 如何取得已安裝的 Go 軟體包的完整清單?
    如何取得已安裝的 Go 軟體包的完整清單?
    檢索Go 中已安裝軟體包的綜合清單在多台電腦上傳輸Go 軟體包安裝時,有必要取得詳細的清單所有已安裝的軟體包。本文概述了此任務的簡單且最新的解決方案。 解決方案:利用“go list”與過時的答案相反,當前的建議列出Go 中已安裝的軟體包是使用“go list”命令。透過指定三個文字句點 ('...
    程式設計 發佈於2024-11-07
  • Offload - 一個統一的 javascript SDK,支援瀏覽器內 AI
    Offload - 一個統一的 javascript SDK,支援瀏覽器內 AI
    今天我想分享Offload,一個直接在使用者瀏覽器上執行AI的javascript SDK。 什麼是卸載? 這是一個SDK,您可以使用它來為您的網站添加AI,但有一個特點:它允許您的用戶在本地運行AI 任務,將資料保存在設備上,從而無需發送資料到第三方推理API。 此外,它降低了...
    程式設計 發佈於2024-11-07
  • 擴充語法與其餘參數:有什麼不同?
    擴充語法與其餘參數:有什麼不同?
    擴展語法與剩餘參數:了解差異在ES2015 中,擴展語法和剩餘參數這兩個新功能提供了強大的方法操作數組和物件。雖然兩者看起來相似,但它們具有不同的用途,並且各自具有自己獨特的功能。 擴展語法擴展語法(由三個點“...”表示) ) 允許您將一個可迭代對象(例如數組或對象)展開或擴展為另一個可迭代物件中...
    程式設計 發佈於2024-11-07
  • 如何使用 CSS 讓圖片隨瀏覽器大小自動調整大小?
    如何使用 CSS 讓圖片隨瀏覽器大小自動調整大小?
    使用CSS 根據瀏覽器大小自動調整圖片大小您希望在調整瀏覽器視窗大小時自動調整圖片大小,但提供的代碼不工作。讓我們研究一個解決方案。 為了讓影像靈活,您需要在它們中加入 max-width: 100% 和 height: auto 。然而,IE8 有一個錯誤,這不起作用。若要修復此問題,請為 IE8...
    程式設計 發佈於2024-11-07
  • Next.js:Web 開發的 React 框架
    Next.js:Web 開發的 React 框架
    I'm thrilled to introduce Next.js, a game-changing React framework for web development. It makes it easy to build fast, server-rendered, and staticall...
    程式設計 發佈於2024-11-07
  • 了解網路儲存
    了解網路儲存
    目录 曲奇饼 本地存储 会话存储 索引数据库 对比分析 安全考虑 结论 介绍 数据存储是现代 Web 应用程序的一个重要方面。无论是保存用户首选项、缓存数据以供离线使用,还是跟踪会话,在浏览器中管理数据的方式都会显着影响用户体验。我们有多种在浏览器中存储数据的选项,...
    程式設計 發佈於2024-11-07
  • 指標如何影響 Go 函數中的值修改?
    指標如何影響 Go 函數中的值修改?
    瞭解 Go 中指標的值修改在 Go 中,指標允許間接存取和修改值。然而,在將指標傳遞給函數時,了解指標的工作原理至關重要。 將指標傳遞給函數時,會出現兩種情況:值修改與指標重新指派。 場景 1 : 值修改考慮這段程式碼:type Test struct { Value int } func main...
    程式設計 發佈於2024-11-07
  • 將 django 部署到生產環境
    將 django 部署到生產環境
    我最近将我自己的 django 应用程序部署到生产环境中。该网站名为 videoeiro.com,是用 django HTML/CSS/JS Tailwind 开发的。 设置 我正在使用 debian 12 服务器,它将通过 cloudflare 隧道公开我的应用程序。所有静态文件都...
    程式設計 發佈於2024-11-07
  • 實作雪花 ID 產生器
    實作雪花 ID 產生器
    什麼是雪花 ID? 雪花 ID 在分散式環境中用於產生無衝突、簡短、唯一的 ID。與依賴資料庫產生 ID 或使用長 128 位元 UUID 等傳統方法不同,Snowflake ID 使用時間和簡單的位元運算。這種巧妙的技術允許每個微服務獨立產生唯一的 ID,而不需要中央系統來避免衝...
    程式設計 發佈於2024-11-07
  • 如何在沒有 JS 框架的情況下使用 CSS 設計 SVG 圖像樣式?
    如何在沒有 JS 框架的情況下使用 CSS 設計 SVG 圖像樣式?
    使用CSS 設定SVG 影像樣式:一種新穎的方法在本文中,我們將探索一種使用CSS 嵌入SVG 影像並操縱其外觀的新穎方法,而無需使用CSS使用JS-SVG 框架。 問題陳述以前,整合 SVG 圖片同時透過 CSS 保持對其元素的存取一直是一個挑戰。雖然 JS-SVG 框架提供了解決方案,但對於具有...
    程式設計 發佈於2024-11-07
  • ## 你能確定使用者是否可以在 JavaScript 中按一下後退按鈕嗎?
    ## 你能確定使用者是否可以在 JavaScript 中按一下後退按鈕嗎?
    瀏覽器歷史記錄導航:確定後退按鈕可用性開發Web 應用程式時,確定使用者是否可以在他們的瀏覽器歷史記錄。然而,出於安全考慮,JavaScript 缺乏直接手段來確定瀏覽器歷史記錄是否存在。 嘗試的解決方案及其限制:1。 History.previous:雖然該屬性理論上提供了有關歷史記錄中上一頁的信...
    程式設計 發佈於2024-11-07
  • 如何在保持模糊背景的同時去除子元素的背景模糊?
    如何在保持模糊背景的同時去除子元素的背景模糊?
    從子元素中刪除背景模糊您有一個 ,其背景圖像應用了模糊效果。但是,所有子元素也會受到這種模糊的影響,這是不想要的。本文提供了解決此問題的解決方案,讓您在保持背景影像的模糊效果的同時保留子元素的清晰度。 解決方案:建立疊加元素要實現此目的,您可以在父元素中建立一個單獨的 並將背景圖像和模糊效果應用到這...
    程式設計 發佈於2024-11-07
  • Leetcode:字串的最大公約數
    Leetcode:字串的最大公約數
    問題陳述 1071. 字串的最大公約數 對於兩個字串 s 和 t,當且僅當 s = t t t ... t t (即 t 與自身連接一次或多次)時,我們才說「t 除 s」。 給定兩個字串 str1 和 str2,傳回使 x 整除 str1 和 str2 的最大字串 x。 ...
    程式設計 發佈於2024-11-07
  • Vue 黑暗面備忘錄 |部分反應性
    Vue 黑暗面備忘錄 |部分反應性
    Hi there DEV.to community! This article will include multiple aspects of Vue 3 that are mostly used or are kind of on the dark side and not paid atten...
    程式設計 發佈於2024-11-07
  • 如何在 Pygame 中同時執行多個 While 迴圈?
    如何在 Pygame 中同時執行多個 While 迴圈?
    如何在Pygame中同時實現多個While循環在Pygame中,可以同時執行多個While循環,允許獨立和程序中的連續操作。 克服執行阻塞在提供的程式碼片段中,問題是由於存在兩個試圖同時運行的 while 循環而引起的。第二個迴圈包含 time.sleep() 函數來引入延遲,它會幹擾第一個迴圈的執...
    程式設計 發佈於2024-11-07

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

Copyright© 2022 湘ICP备2022001581号-3