藍橋杯試題:DFS回溯

一、題目要求

輸入一個數組n,輸出1到n的全排列

二、代碼展示

import java.util.*;public class ikun {static List<List<Integer>> list = new ArrayList<>();public static void main(String[] args) {    Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] v = new int[n + 1];List<Integer> res = new ArrayList<>();dfs(n,v,res);for (List<Integer> x:list){for (int y:x){System.out.print(y + " ");}System.out.println();}}public static void dfs(int n, int[] v, List<Integer> res) {// 終止條件:當當前排列長度等于n時if (res.size() == n) {// 深拷貝當前排列結果到結果集list.add(new ArrayList<>(res));return; // 結束當前遞歸分支}// 遍歷所有數字1~nfor (int i = 1; i <= n; i++) {// 跳過已使用的數字(剪枝操作)if (v[i] == 1) continue;// 選擇階段:將數字i加入當前排列res.add(i);           // 操作路徑v[i] = 1;             // 更新狀態標記// 遞歸深入:探索下一層決策樹dfs(n, v, res);       // 進入新的遞歸層級// 回溯階段:撤銷當前選擇res.remove(res.size() - 1); // 移除最后一個元素(i)v[i] = 0;                   // 重置狀態標記}}} 

核心邏輯

  1. 主方法(main)

    • 創建標記數組v(索引1到n標記數字是否被使用)。

    • 調用DFS函數生成排列。

    • 遍歷結果列表list,輸出所有排列。

  2. DFS方法(dfs)

    • 終止條件:當臨時結果res的大小等于n時,將當前排列存入list

    • 遞歸過程

      • 遍歷數字1到n。

      • 若當前數字未被使用(v[i] == 0):

        • 將數字加入res,并標記為已使用。

        • 遞歸調用DFS,繼續生成剩余位置的排列。

        • 回溯:遞歸返回后,移除res末尾元素,并重置標記,以便嘗試其他數字。

關鍵點分析

  • 標記數組v:用于避免重復使用數字。v[i] = 1表示數字i已被使用。

  • 回溯機制:在遞歸返回后,撤銷當前選擇(移除res末尾元素,重置標記),確保后續分支的正確性。

  • 結果存儲:每次找到完整排列時,復制reslist(避免后續修改影響已存結果)。

三、DFS算法

1、DFS算法核心思想

深度優先搜索(DFS)?是一種"先探到底再回溯"的算法,其核心特征是:

  1. 優先沿著一條路徑深入探索到底

  2. 遇到終點或無法繼續時回溯到最近的分支點

  3. 通過遞歸或棧結構實現路徑記錄和狀態回退

基礎語法:

public static void dfs(){if (當前狀態 == 目標狀態){//邏輯處理return;}for (尋找新狀態){if (狀態合法){dfs(新狀態);}}}

回溯

 public static void dfs(){if (當前狀態 == 目標狀態){//邏輯處理return;}for (查找新狀態){if (狀態合法){//標記當前狀態已訪問dfs(新狀態);//撤銷標記}}}

2、代碼中的DFS實現解析

代碼結構概覽
static List<List<Integer>> list = new ArrayList<>(); // 存儲所有排列結果public static void dfs(int n, int[] v, List<Integer> res) {// 終止條件if (res.size() == n) {list.add(new ArrayList<>(res)); // 保存當前排列return;}// 遍歷所有可能選擇for (int i = 1; i <= n; i++) {if (v[i] == 1) continue;  // 跳過已使用的數字// 做選擇res.add(i);v[i] = 1;// 遞歸深入dfs(n, v, res);// 撤銷選擇(回溯)res.remove(res.size() - 1);v[i] = 0;}
}

3、代碼與DFS原理的對應關系

DFS階段代碼實現說明
1. 路徑選擇res.add(i)將當前數字加入排列路徑
2. 狀態標記v[i] = 1標記該數字已被使用
3. 遞歸深入dfs(n, v, res)進入下一層決策樹
4. 回溯恢復res.remove(...); v[i] = 0返回上層時撤銷選擇
5. 終止條件if (res.size() == n)當路徑長度等于n時記錄結果

4、執行流程演示(n=2)

初始調用:dfs(2, [0,0,0], [])↓
i=1被選中:res=[1], v=[0,1,0]→ 遞歸調用 dfs(2, [0,1,0], [1])↓i=2被選中:res=[1,2], v=[0,1,1]→ 記錄結果 [1,2]← 回溯:res變為[1], v[2]=0← 返回上層← 回溯:res變為[], v[1]=0i=2被選中:res=[2], v=[0,0,1]→ 遞歸調用 dfs(2, [0,0,1], [2])↓i=1被選中:res=[2,1], v=[0,1,1]→ 記錄結果 [2,1]← 回溯:res變為[2], v[1]=0← 返回上層← 回溯:res變為[], v[2]=0

5、算法特性分析

特性本代碼中的體現
時間復雜度O(n!) - 需要生成n!種排列
空間復雜度O(n) - 遞歸棧深度為n
回溯機制通過removev[i]=0顯式實現狀態回退
剪枝優化使用v數組避免重復選擇
結果存儲使用new ArrayList<>(res)深度拷貝當前狀態

6、DFS的典型應用場景

  1. 全排列/組合問題(如本代碼所示)

  2. 迷宮路徑搜索

  3. 樹/圖的遍歷

  4. 棋盤類游戲解法(八皇后、數獨等)

  5. 連通分量檢測


通過這種遞歸+回溯的實現方式,DFS算法能系統性地遍歷所有可能的解空間,特別適合需要窮舉所有可能性的場景。代碼中通過標記數組和列表操作,清晰地展現了DFS的核心思想。

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

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

相關文章

Ruby基礎

一、字符串 定義 283.to_s //轉為string "something#{a}" //定義字符串&#xff0c;并且插入a變量的值 something//單引號定義變量 %q(aaaaaaaaa) // 定義字符串&#xff0c;&#xff08;&#xff09;內可以是任何數&#xff0c;自動轉義雙引號%Q("aaaaa"…

基于提示驅動的潛在領域泛化的醫學圖像分類方法(Python實現代碼和數據分析)

摘要 醫學圖像分析中的深度學習模型易受數據集偽影偏差、相機差異、成像設備差異等導致的分布偏移影響&#xff0c;導致在真實臨床環境中診斷不可靠。領域泛化&#xff08;Domain Generalization, DG&#xff09;方法旨在通過多領域訓練提升模型在未知領域的性能&#xff0c;但…

C#—Settings配置詳解

C#—Settings配置詳解 在C#項目中&#xff0c;全局配置通常指的是應用程序的設置&#xff08;settings&#xff09;&#xff0c;這些設置可以跨多個類或組件使用&#xff0c;并且通常用于存儲應用程序的配置信息&#xff0c;如數據庫連接字符串、用戶偏好設置等。 Settings配置…

國自然面上項目|基于多模態MR影像的膠質母細胞瘤高危區域定位及預后預測研究|基金申請·25-02-28

小羅碎碎念 今天和大家分享一個面上項目&#xff0c;執行年限為2019.01&#xff5e;2022.12&#xff0c;直接費用為57萬元。 膠質母細胞瘤&#xff08;GBM&#xff09;預后差且差異大&#xff0c;異質性是重要因素&#xff0c;臨床手段難評價。影像組學為異質性研究提供方法&am…

Nat Mach Intell | AI分子對接算法評測

《Nature Machine Intelligence》發表重磅評測&#xff0c;系統評估AI與物理方法在虛擬篩選&#xff08;VS&#xff09;中的表現&#xff0c;突破藥物發現效率瓶頸。 核心評測體系&#xff1a;三大數據集 研究團隊構建了三個新型測試集&#xff1a; TrueDecoy&#xff1a;含14…

安路FPGA開發入門:軟件安裝與點燈與仿真(TangDynasty ModelSim)

文章目錄 前言軟件安裝開發軟件仿真軟件 點燈測試代碼編寫與編譯引腳分配固件下載 仿真測試ModelSim添加仿真庫TangDynasty仿真設置進行仿真 后記 前言 最近因為工作需要用安路的FPGA&#xff0c;這里對安路FPGA開發相關流程做個記錄。作為測試只需要一個核心板&#xff08;我這…

千峰React:外部庫引用

flushSync強制刷新 如果不強制刷新是這樣&#xff1a;每次count在下一輪才更新 import { useState, useRef } from react import { flushSync } from react-domfunction App() {const [count, setCount] useState(0)const refuseRef(null)const handleClick () > { setCo…

防火墻旁掛組網雙機熱備負載均衡

一&#xff0c;二層交換網絡&#xff1a; 使用MSTPVRRP組網形式 VLAN 2--->SW3為主,SW4 作為備份 VLAN 3--->SW4為主,SW3 作為備份 MSTP 設計 --->SW3 、 4 、 5 運行 實例 1 &#xff1a; VLAN 2 實例 2 &#xff1a; VLAN 3 SW3 是實例 1 的主根&#xff0c;實…

結合PyMuPDF+pdfplumber,刪除PDF指定文本后面的內容

?? 一、需求場景解析 在日常辦公中,我們經常會遇到這樣的痛點: 合同處理:收到上百份PDF合同,需要找到"簽署頁"之后的內容并刪除報表加工:批量移除財務報表中的敏感數據區域文檔歸檔:快速提取技術文檔的關鍵章節傳統的手動操作方式存在三大致命缺陷: ? 耗時…

二、QT和驅動模塊實現智能家居----2、編譯支持QT的系統

因為我們的Linux內核文件不支持QT系統&#xff08;當然如果你的支持&#xff0c;完全跳過這篇文章&#xff09;&#xff0c;所以我們要從網上下載很多軟件包&#xff0c;這里直接用百問網的軟件包&#xff0c;非常方便。 一&#xff1a;Ubuntu 配置 1 設置交叉編譯工具鏈 以…

el-select的下拉選擇框插入el-checkbox

el-check注意這里要使用model-value綁定數據 <el-selectv-model"selectDevice"multiplecollapse-tags:multiple-limit"5"style"width: 200px"popper-class"select-popover-class" ><el-optionv-for"item in deviceList…

UNION 和 UNION ALL 的區別:深入解析 SQL 中的合并操作

在 SQL 的世界里&#xff0c;當我們需要合并多個查詢結果集時&#xff0c;UNION和UNION ALL是兩個常用的操作符。雖然它們的功能看起來相似&#xff0c;但實際上有著重要的區別&#xff0c;這些區別在不同的應用場景中會對查詢結果和性能產生顯著影響。本文將詳細探討UNION和UN…

5.Linux配置虛擬機

步驟一 步驟二 步驟三 步驟四 finalshell

2024華為OD機試真題-熱點網站統計(C++)-E卷-100分

2024華為OD機試最新E卷題庫-(C卷+D卷+E卷)-(JAVA、Python、C++) 目錄 題目描述 輸入描述 輸出描述 用例1 用例2 考點 題目解析 代碼 c++ 題目描述 企業路由器的統計頁面,有一個功能需要動態統計公司訪問最多的網頁 URL top N。 請設計一個算法,可以高效動態統計 …

SOUI基于Zint生成EAN碼

EAN碼廣泛應用與歐洲的零售業。包括EAN-2、EAN-5、EAN-8和EAN-12碼。分別編碼 2、5、7 或 12 位數字。此外&#xff0c;可以使用 字符將 EAN-2 和 EAN-5 附加符號添加到 EAN-8 和 EAN-13 符號中&#xff0c;就像 UPC 符號一樣。 EAN-8校驗碼計算&#xff1a; 從左往右奇數位的…

QT實現簡約美觀的動畫Checkbox

*最終效果: * 一共三個文件: main.cpp , FancyCheckbox.h , FancyCheckbox.cpp main.cpp #include <QApplication> #include "FancyCheckbox.h" #include <QGridLayout> int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget* w new…

arm | lrzsz移植記錄

1 我的使用場景 開發板無網絡, 無奈只得用U盤拷貝文件 文件不大, 每次都插拔U盤, 很繁瑣 原來的環境不支持rz等命令 就需要移植這個命令來使用 下載地址 https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2 編譯腳本 # 主要內容在這里 configure_for_arm(){mkdir -p $PA…

Hadoop之01:HDFS分布式文件系統

HDFS分布式文件系統 1.目標 理解分布式思想學會使用HDFS的常用命令掌握如何使用java api操作HDFS能獨立描述HDFS三大組件namenode、secondarynamenode、datanode的作用理解并獨立描述HDFS讀寫流程HDFS如何解決大量小文件存儲問題 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…

矩陣 trick 系列 題解

1.AT_dp_r Walk&#xff08;矩陣圖論&#xff09; 題意 一個有向圖有 n n n 個節點&#xff0c;編號 1 1 1 至 n n n。 給出一個二維數組 A 1... n , 1... n A_{1...n,1...n} A1...n,1...n?&#xff0c;若 A i , j 1 A_{i,j}1 Ai,j?1 說明節點 i i i 到節點 j j j …

使用AoT讓.NetFramework4.7.2程序調用.Net8編寫的庫

1、創建.Net8的庫&#xff0c;雙擊解決方案中的項目&#xff0c;修改如下&#xff0c;啟用AoT&#xff1a; <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>Library</OutputType><PublishAot>true</PublishAot>&…