算法(十三)回溯算法---N皇后問題

文章目錄

  • 算法概念
  • 經典例子 - N皇后問題
    • 什么是N皇后問題?
    • 實現思路

算法概念

  • 回溯算法是類似枚舉的深度優先搜索嘗試過程,主要是再搜索嘗試中尋找問題的解,當發生不滿足求解條件時,就會”回溯“返回(也就是遞歸返回),嘗試別的路徑求解

經典例子 - N皇后問題

什么是N皇后問題?

N皇后問題研究的是:如何將n個皇后放在n * n的棋盤上,并且使皇后彼此之間不能相遇,也就是一個皇后的上下左右、以及斜著對角線上都不能有另外一個皇后,也就是一個皇后在 ”米“ 的視線中不能遇到另外一個皇后。
在這里插入圖片描述

實現思路

如上圖,我們可以把這個問題劃分成8個階段,依次將8個棋子放到第一行、第二行…第八行。在放置的過程中,我們不停的檢查當前的方法是否滿足要求。如果滿足,繼續下一行放置,如果不滿足,就再換一種方法,繼續嘗試。

實現代碼:

package com.xxliao.algorithms.backtrack;/*** @author xxliao* @description: N皇后問題 求解* @date 2024/6/1 0:14*/
public class NQueens {public static void main(String[] args) {NQueens queens=new NQueens();queens.setQueens(0);queens.printQueens();}// 皇后數量static int queens_count = 8;// 定義數組來存在皇后,索引表示行,值表示皇后存在改行的那一列中int[] array = new int[queens_count];/*** @description  根據行號,設置該行的皇后位置* @author  xxliao* @date  2024/6/1 0:17*/public void setQueens(int row) {if(row == queens_count) {// 遞歸結束條件return;}// 嘗試每一列放置,如果沒有合適的,就返回上一層for(int column = 0; column <queens_count; column++) {if(isOk(row,column)) {// 符合條件,放置array[row] = column;// 然后設置下一行setQueens(++row);}}}/*** @description  判斷改行該列是否 符合條件* @author  xxliao* @date  2024/6/1 0:23*/private boolean isOk(int row, int column) {// 定義左上角、右上角 列索引標記int leftup = column - 1;int rightup = column + 1;// 然后從當前行逐行向上遍歷,看當前row、column是否滿足條件for(int i = row-1; i >= 0; i--) {if(array[i] == column){// 如果該位置已經有了皇后了,不滿足return false;}if(leftup >=0 && array[i] == leftup) {//左上對角線存在queen,第一次執行是當前行,肯定不滿足條件,i--,leftup--之后就是當前點的左上角位置return false;}if(rightup < queens_count && array[i] == rightup) {//右下對角線存在queen,同上理由return false;}leftup--;rightup++;}return true;}/*** @description  打印N皇后棋盤* @author  xxliao* @date  2024/6/1 0:34*/private void printQueens() {for (int i = 0; i < queens_count; i++) {for (int j = 0; j < queens_count; j++) {if (array[i] == j) {System.out.print("Q| ");}else {System.out.print("*| ");}}System.out.println();}System.out.println("-----------------------");}
}

演示結果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21184.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21184.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21184.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

enum4linux一鍵查詢SMB信息(KALI工具系列十六)

目錄 1、KALI LINUX簡介 2、enum4linux工具簡介 3、在KALI中使用enum4linux 3.1 目標主機IP&#xff08;win&#xff09; ?編輯 3.2 KALI的IP 4、操作示例 4.1 運行工具 4.2 列出用戶名 4.3 提取用戶名 4.4 使用自定義RID范圍 4.5 列出組 4.6 列出共享文件夾 4.7…

【筆記小記】掌握市場脈動:全營銷解決方案的力量

前面雖然說了這個模型&#xff0c;而且是分章說的&#xff0c;那么在此以筆記小記的形式再說一下&#xff0c;企業面臨的挑戰與日俱增&#xff0c;消費者需求的多樣化、技術的不斷進步、全球化的深入以及社會責任的日益重要&#xff0c;這些因素共同塑造了市場的現狀和未來&…

網絡監聽技術

網絡監聽技術 網絡監聽概述網絡監聽環境 流量劫持網絡環境共享式網絡監聽原理交換式網絡監聽交換機的工作方式交換網絡監聽&#xff1a;交換機集線器交換網絡監聽&#xff1a;端口鏡像交換網絡監聽&#xff1a;MAC洪泛交換網絡監聽&#xff1a;MAC洪泛交換網絡監聽&#xff1a;…

【Unix】消息類的格式與使用

本文給出一個MacOS操作系統中的消息類的使用過程示例&#xff08;結合gencat命令&#xff0c;<nl_types.h>頭文件以及catopen,catgets,catclose3個函數&#xff09; 首先根據對應的操作系統&#xff0c;查看gencat命令 man gencat 可以詳細看到其中對于輸入文件&#x…

Typescript高級: 深入理解extends keyof語法

概述 在TypeScript中&#xff0c;extends關鍵字是類型系統中一個極其重要的組成部分它不僅用于類的繼承&#xff0c;也是類型兼容性檢查和泛型約束的關鍵機制特別是當它與keyof關鍵字結合&#xff0c;形成K extends keyof T的結構時它為類型系統帶來了強大的靈活性和表達能力&…

動態SQL where, choose語句

where語句就一個<where>標簽, 很簡單, 不再過多贅述 接下來我們來看 choose語句的使用 其實choose語句就像java里的swith語句 , 如果語句前面的生效 , 后面的就不會生效了 可以定義查詢的優先級

讀人工智能時代與人類未來筆記19_讀后總結與感想兼導讀

1. 基本信息 人工智能時代與人類未來 (美)亨利基辛格,(美)埃里克施密特,(美)丹尼爾胡滕洛赫爾 著 中信出版社,2023年6月出版 1.1. 讀薄率 書籍總字數145千字&#xff0c;筆記總字數39934字。 讀薄率39934145000≈27.5% 1.2. 讀厚方向 千腦智能 腦機穿越 未來呼嘯而來 …

【工具】 MyBatis Plus的SQL攔截器自動翻譯替換“?“符號為真實數值

【工具】 MyBatis Plus的SQL攔截器自動翻譯替換"?"符號為真實數值 使用MyBatis的配置如下所示&#xff1a; mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl調用接口&#xff0c;sql日志打印如下&#xff1a; 參數和sql語句不…

Spring Boot配置MySQL數據庫連接數

1.如何在Spring Boot中配置MySQL數據庫的連接數 1.1主要配置 在Spring Boot中配置MySQL數據庫連接數通常涉及到兩個主要的配置&#xff1a; &#xff08;1&#xff09;數據源配置&#xff1a;這通常是在application.properties或application.yml文件中完成的&#xff0c;用于…

頂底背離的終極猜想和運用

這幾天圈內都在傳底蓓離什么的。作為嚴肅的量化自媒體&#xff0c;我們就不跟著吃這波瓜了。不過&#xff0c;我一直很關注技術指標的頂背離和底背離&#xff0c;一直在追問它的成因如何&#xff0c;以及如何預測。 底蓓離把我目光再次吸引到這個領域來&#xff0c;于是突然有…

Java如何實現二維數組行列轉換

二維數組行列轉換就是行號和列號互換 public class Erweishuzubianli {public static void main(String[] args) {int array[][]new int[][]{{8,75,23},{21,55,34},{15,23,20}};int temp;for(int i0;i<array.length;i){for(int j0;j<array[i].length;j){temparray[i][j]…

LitCTF 2024(公開賽道)——WP

目錄 Misc 涐貪戀和伱、甾―⑺d毎兮毎秒 你說得對&#xff0c;但__ 盯幀珍珠 Everywhere We Go 關鍵&#xff0c;太關鍵了! 女裝照流量 原鐵&#xff0c;啟動&#xff01; 舔到最后應有盡有 The love Web exx 一個....池子&#xff1f; SAS - Serializing Authent…

MySQL—函數—日期函數(基礎)

一、引言 接下來討論和學習關于函數的第三個方面——日期函數。 常見的MySQL當中的日期函數。 注意&#xff1a; 1、CURDATE()&#xff1a;cur&#xff1a;current 當前的&#xff0c;返回的是當前日期。 2、CURTIME()&#xff1a;當前時間。 3、NOW&#xff1a;當前的日期和…

Java語言高級編程:探索深層機制與應用技巧

Java語言高級編程&#xff1a;探索深層機制與應用技巧 在編程世界中&#xff0c;Java以其穩定、強大和跨平臺的特性贏得了廣泛的贊譽和應用。對于已經掌握Java基礎知識的開發者來說&#xff0c;深入Java語言的高級編程領域&#xff0c;無疑將開啟全新的技術視野。那么&#xf…

政安晨【零基礎玩轉各類開源AI項目】:解析開源項目的論文:Physical Non-inertial Poser (PNP)

政安晨的個人主頁&#xff1a;政安晨 歡迎 &#x1f44d;點贊?評論?收藏 收錄專欄: 零基礎玩轉各類開源AI項目 希望政安晨的博客能夠對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff01; 本文解析的原始論文為&#xff1a;https://arxiv.org/…

力扣1143. 最長公共子序列

給定兩個字符串 text1 和 text2&#xff0c;返回這兩個字符串的最長 公共子序列 的長度。如果不存在 公共子序列 &#xff0c;返回 0 。 一個字符串的 子序列 是指這樣一個新的字符串&#xff1a;它是由原字符串在不改變字符的相對順序的情況下刪除某些字符&#xff08;也可以…

【TB作品】MSP430G2533,讀取dht11,顯示到lcd1602顯示屏,串口發送到電腦

功能 讀取dht11&#xff0c;顯示到lcd1602顯示屏&#xff0c;串口發送到電腦。 部分程序 void main(void) {char disp[20];char count 0;WDTCTL WDTPW WDTHOLD; // Stop WDTP1DIR 0Xff;P1SEL 0X00;P1SEL2 0X00;P2DIR 0Xff;P2SEL 0X00;P2SEL2 0X00;L…

為什么需要開局調用函數?

初始化操作&#xff1a;在你的應用程序啟動時&#xff0c;可能需要執行一些初始化操作&#xff0c;例如設置默認值、加載配置、建立數據庫連接等。開局調用函數可以幫助你集中管理這些操作&#xff0c;確保它們在應用程序啟動時順利執行。 統一入口&#xff1a;通過一個統一的…

打造你的專屬Vue組件:基于FullCalendar超實用“日程任務管理組件”實戰

打造你的專屬Vue組件&#xff1a;基于FullCalendar超實用“日程任務管理組件”實戰 在現代Web應用中&#xff0c;日程管理是一個常見而又關鍵的功能&#xff0c;它幫助用戶高效安排和追蹤日常任務及會議。Vue.js作為一個流行的前端框架&#xff0c;以其簡潔的語法和強大的組件…

編譯選項導致的結構體字節參數異常

文章目錄 前言問題描述原因分析問題解決總結 前言 在構建編譯工程時&#xff0c;會有一些對應的編譯配置選項&#xff0c;不同的編譯器&#xff0c;會有對應的配置項。本文介紹GHS工程中編譯選項配置不對應導致的異常。 問題描述 在S32K3集成工程中&#xff0c;核1的INP_SWC…