【代碼隨想錄——回溯算法——四周目】

1.重新安排行程

在這里插入圖片描述

1.1 我的代碼,超時通不過

var (used   []boolpath   []stringres    []stringisFind bool
)func findItinerary(tickets [][]string) []string {sortTickets(tickets)res = make([]string, len(tickets)+1)path = make([]string, 0)used = make([]bool, len(tickets))isFind = falsestart := "JFK"path = append(path, start)dfs(start, 0, tickets)return res
}func dfs(start string, num int, tickets [][]string) {if isFind {return}if num == len(tickets) {copy(res, path)isFind = truereturn}for i := 0; i < len(tickets); i++ {// 當前機票未使用,且起點為startif !used[i] && tickets[i][0] == start {used[i] = truepath = append(path, tickets[i][1])dfs(tickets[i][1], num+1, tickets)if isFind {return}path = path[:len(path)-1]used[i] = false}}
}func sortTickets(tickets [][]string) {sort.Slice(tickets, func(i, j int) bool {if tickets[i][0] == tickets[j][0] {return tickets[i][1] < tickets[j][1]}return tickets[i][0] < tickets[j][0]})
}

1.2 正確的解法

首先先把圖的鄰接表存進字典,并且按字典序排序,然后從‘JFK’開始深搜,每前進一層就減去一條路徑,直到某個起點不存在路徑的時候就會跳出while循環進行回溯,相對先找不到路徑的一定是放在相對后面,所以當前搜索的起點from會插在當前輸出路徑的第一個位置。

// No.332 重新安排行程
type pair struct {// pair儲存機票目的地和當前航線是否已經使用target  stringvisited bool
}// 儲存pair數組,實現sort接口
type pairs []*pairfunc (p pairs) Len() int {return len(p)
}func (p pairs) Swap(i, j int) {p[i], p[j] = p[j], p[i]
}func (p pairs) Less(i, j int) bool {return p[i].target < p[j].target
}func findItinerary(tickets [][]string) (res []string) {// record儲存每個機場可到達的目的地,以及當前航線是否已選擇targets := make(map[string]pairs, 0)for _, ticket := range tickets {if targets[ticket[0]] == nil {targets[ticket[0]] = make(pairs, 0)}// 添加新的可達目的地,初始置為未選擇targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false})}for k := range targets {// 按字典升序排序目的地,保證第一個選出的就是字典序最小的結果sort.Sort(targets[k])}var backtrack func() boolbacktrack = func() bool {if len(tickets)+1 == len(res) {// 結果機場數量比票數大1說明已經構建出所有路徑,找到了結果return true}// 當前所在機場here := res[len(res)-1]for i, t := range targets[here] {if i > 0 && targets[here][i-1].target == t.target && !targets[here][i-1].visited {// 剪枝(非常重要),如果上一個目的地和當前的相同,且上一個沒用過,說明是從上一個回溯回來的// 上一個不可能那么當前的也不可能,直接跳過continue}// 枚舉所有可能的目的地,已經使用過的航線除外if !t.visited {res = append(res, t.target)t.visited = trueif backtrack() {return true}res = res[:len(res)-1]t.visited = false}}return false}// 所有機票從JFK出發res = append(res, "JFK")backtrack()return
}

2.N皇后

在這里插入圖片描述

var (res  [][]stringpath [][]int
)func solveNQueens(n int) [][]string {res = make([][]string, 0)path = make([][]int, n)for i := 0; i < n; i++ {path[i] = make([]int, n)}dfs(n, 0)return res
}func dfs(n int, curRow int) {if curRow == n {temp := make([]string, 0)for i := 0; i < n; i++ {str := ""for j := 0; j < n; j++ {if path[i][j] == 0 {str = str + "."} else {str = str + "Q"}}temp = append(temp, str)}res = append(res, temp)}for i := 0; i < n; i++ {if canPlaceQueen(curRow, i, n) {path[curRow][i] = 1dfs(n, curRow+1)path[curRow][i] = 0}}
}func canPlaceQueen(row, col, n int) bool {if row >= n || col >= n || row < 0 || col < 0 {return false}// 檢查同行同列的情況for i := 0; i < n; i++ {if path[i][col] == 1 {return false}if path[row][i] == 1 {return false}}// 檢查主對角線row1, col1 := row, colfor row1 >= 0 && col1 >= 0 {if path[row1][col1] == 1 {return false}row1--col1--}row1, col1 = row, colfor row1 < n && col1 < n {if path[row1][col1] == 1 {return false}row1++col1++}// 檢查副對角線row1, col1 = row, colfor row1 >= 0 && col1 < n {if path[row1][col1] == 1 {return false}row1--col1++}row1, col1 = row, colfor row1 < n && col1 >= 0 {if path[row1][col1] == 1 {return false}row1++col1--}return true
}

3.解數獨

在這里插入圖片描述

var (chunks     [9][]boolrows       [9][]boolcols       [9][]boolmatrixSize int  = 9emptyCount int  = 0hasFind    bool = false
)func solveSudoku(board [][]byte) {emptyCount = 0hasFind = falsefor i := 0; i < matrixSize; i++ {chunks[i] = make([]bool, 10) //用來表示每個區域中的數字1-9是否已經被使用rows[i] = make([]bool, 10)   //用來表示每行中的數字1-9是否已經被使用cols[i] = make([]bool, 10)   //用來表示每列中的數字1-9是否已經被使用}for i := 0; i < matrixSize; i++ {for j := 0; j < matrixSize; j++ {if board[i][j] != '.' {num := board[i][j] - '0'chunkId := findChunkIndex(i, j)chunks[chunkId][num] = truerows[i][num] = truecols[j][num] = true} else {emptyCount++}}}dfs(emptyCount, board, &hasFind)
}func dfs(emptyCount int, board [][]byte, hasFind *bool) {if *hasFind { //在其他分支已經找到答案了return}if emptyCount == 0 { //空格全部填完,找到答案*hasFind = truereturn}for i := 0; i < matrixSize; i++ {for j := 0; j < matrixSize; j++ {if board[i][j] == '.' {for num := byte(1); num <= 9; num++ {if canPlaceNumber(i, j, num) {chunkId := findChunkIndex(i, j)board[i][j] = '0' + numchunks[chunkId][num] = truerows[i][num] = truecols[j][num] = trueemptyCount--dfs(emptyCount, board, hasFind)if *hasFind { //在其他分支已經找到答案了return}chunks[chunkId][num] = falserows[i][num] = falsecols[j][num] = falseboard[i][j] = '.'emptyCount++}}return}}}
}
//查看在該位置是否能放下該數
func canPlaceNumber(row, col int, num byte) bool {//行列中是否已經有這個數if rows[row][num] || cols[col][num] {return false}//3*3的塊中是否有這個數if chunks[findChunkIndex(row, col)][num] {return false}return true
}
//找到所屬的3*3的塊
func findChunkIndex(row, col int) int {return (row/3)*3 + col/3
}

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

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

相關文章

JSON Web Token

JWT 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一種用于在各方之間作為JSON對象安全地傳輸信息的開放標準&#xff08;RFC 7519&#xff09;。該信息經過數字簽名&#xff0c;因此是可驗證和可信的。JWT 可以使用HMAC算法或使用RSA的公鑰/私鑰對進行簽名 JWT的…

微信小程序 vant Picker組件default-index不生效的解決辦法

1、原始的寫法以及問題 <van-popup show"{{ showPopup && cellClick Freq }}" position"bottom" bind:close"onPopupClose"><van-picker value-key"Spec" show-toolbar title"{{cellClick Freq ? showPcCha…

win10鍵盤按亂了,如何恢復?

今天鍵盤被寶寶給按亂了&#xff0c;好不容易給重新調整回來&#xff0c;記錄備忘&#xff1a; 1、win10的asdf和方向鍵互換了&#xff1a; 使用Fnw鍵來回切換&#xff0c;OK&#xff01; 2、鍵盤的win鍵失效&#xff0c;例如&#xff1a;按winD無法顯示桌面。此時&#xf…

Day30

Day30 CSS CSS常用樣式 font-family:“微軟雅黑” -設置字體 font-size: 50px -設置字體大小 font-style : italic-設置字體風格 font-weight:bolder -設置字體粗細 color: white-設置字體顏色 letter-spacing: 20px-設置文本內容的間隔 text-decoration :underline - 設置劃…

電動汽車電子系統架構

電動汽車的普及正在穩步發展&#xff0c;供應鏈的各個環節也在發生變化。它涵蓋了制造電動汽車零件的原材料、化學品、電池和各種組件。與此同時&#xff0c;汽車充電基礎設施也參與其中&#xff0c;它們正經歷一個歷史性的階段&#xff0c;經過徹底的重新設計。它們的電氣化以…

Wpf 使用 Prism 實戰開發Day30

登錄界面設計 一.準備登錄界面圖片素材&#xff08;透明背景圖片&#xff09; 1.把準備好的圖片放在Images 文件夾下面&#xff0c;格式分別是.png和.ico 2.選中 login.png圖片鼠標右鍵&#xff0c;選擇屬性。生成的操作選擇>資源 3.MyTodo 應用程序右鍵&#xff0c;屬性&a…

如何修改開源項目中發現的bug?

如何修改開源項目中發現的bug&#xff1f; 目錄 如何修改開源項目中發現的bug&#xff1f;第一步&#xff1a;找到開源項目并建立分支第二步&#xff1a;克隆分支到本地倉庫第三步&#xff1a;在本地對項目進行修改第四步&#xff1a;依次使用命令行進行操作注意&#xff1a;Gi…

地質災害位移應急監測站

地質災害位移應急監測站是一種專門用于地質災害預警和應急響應的設施&#xff0c;它能夠實時監測和分析山體、建筑物、管道等的位移變化情況。以下是關于地質災害位移應急監測站的詳細介紹&#xff1a; 主要組成部分 傳感器&#xff1a;安裝于需要監測的位置&#xff0c;用于…

RK3588+FPGA+AI高性能邊緣計算盒子,應用于視頻分析、圖像視覺等

搭載RK3588&#xff08;四核 A76四核 A55&#xff09;&#xff0c;CPU主頻高達 2.4GHz &#xff0c;提供1MB L2 Cache 和 3MB L3 &#xff0c;Cache提供更強的 CPU運算能力&#xff0c;具備6T AI算力&#xff0c;可擴展至38T算力。 產品規格 系統主控CPURK3588&#xff0c;四核…

Nginx服務器替換SSL證書記得要重啟

輸入訪問域名&#xff0c;發現https證書過期了&#xff0c;果斷申請好ssl證書&#xff0c;并在Nginx服務器上將原證書替換成新申請的證書。 打開瀏覽器輸入網址確認一看&#xff0c;還是原來的證書并沒有替換成功?感覺不合常理 以下開啟了證書為什么替換不成功的排查 1、清除…

GUI 02:布局管理器相關知識,AWT 的 3 種布局管理器應用,以及嵌套布局的使用

一、前言 記錄時間 [2024-05-31] 前置文章 GUI 01&#xff1a;GUI 編程概述&#xff0c;AWT 相關知識&#xff0c;Frame 窗口&#xff0c;Panel 面板&#xff0c;及監聽事件的應用 本文講述了 GUI 編程種布局管理器的相關知識&#xff0c;以及 AWT 的 3 種布局管理器——流式布…

【FPGA】Verilog語言從零到精通

接觸fpga一段時間&#xff0c;也能寫點跑點吧……試試系統地康康呢~這個需要耐心但是回報巨大的工作。正原子&&小梅哥 15_語法篇&#xff1a;Verilog高級知識點_嗶哩嗶哩_bilibili 1Verilog基礎 Verilog程序框架&#xff1a;模塊的結構 類比&#xff1a;c語言的基礎…

P3881

最小值最大 二分&#xff1a;枚舉兩個牛之間的最小距離&#xff0c;左端點是1&#xff0c;右端點是籬笆總長度。 Check數組&#xff1a; 如果兩頭牛之間距離是Mid不合法&#xff0c;則返回0&#xff08;false&#xff09;&#xff1b; 如果兩頭牛之間距離是Mid合法&#xf…

去噪擴散概率模型在現代技術中的應用:圖像生成、音頻處理到藥物發現

去噪擴散概率模型&#xff08;DDPMs&#xff09;是一種先進的生成模型&#xff0c;它通過模擬數據的噪聲化和去噪過程&#xff0c;展現出多方面的優勢。DDPMs能夠生成高質量的數據樣本&#xff0c;這在圖像合成、音頻生成等領域尤為重要。它們在數據去噪方面表現出色&#xff0…

瑞吉外賣項目學習筆記(二)后臺系統的員工管理業務開發

一、完善登錄功能 1.1 問題分析 1.2 代碼實現 package com.itheima.reggie.filter;//這是一個過濾器類 //登錄檢查過濾器import com.alibaba.fastjson.JSON; import com.itheima.reggie.common.R; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf…

華為OD機試-最大坐標值

題目描述與示例 題目描述 小明在玩一個游戲&#xff0c;游戲規則如下&#xff1a;在游戲開始前&#xff0c;小明站在坐標軸原點處&#xff08;坐標值為 0&#xff09;給定一組指令和一個幸運數&#xff0c;每個指令都是一個整數&#xff0c;小明按照指定的要求前進或者后退指…

解析Java中1000個常用類:FunctionalInterface類,你學會了嗎?

Java 8 引入了一系列新的特性和改進,其中之一便是函數式編程。函數式接口(Functional Interface)是函數式編程的核心概念之一。本文將深入探討 FunctionalInterface 注解,介紹其用法、重要性,并通過示例展示如何在實際開發中應用函數式接口。 什么是函數式接口? 函數式…

有向圖的拓撲排序

文章目錄 概念及模板例題 雜務 概念及模板 有向圖的拓撲排序是指將有向無環圖中的所有頂點排成一個線性序列&#xff0c;使得圖中任意一對頂點u和v&#xff0c;若邊(u, v)在圖中&#xff0c;則u在該序列中排在v的前面。 例如&#xff0c;假設有n個任務&#xff0c;這些任務需…

HarmonyOS鴻蒙學習筆記(28)@entry和@Component的生命周期

entry和Component的生命周期 entry和Component的關系Component生命周期Entry生命周期 生命周期流程圖生命周期展示示例代碼參考資料 HarmonyOS的生命周期可以分為Compnent的生命周期和Entry的生命周期&#xff0c;也就是自定義組件的生命周期和頁面的生命周期。 entry和Compone…

【傳知代碼】雙深度學習模型實現結直腸癌檢測(論文復現)

前言&#xff1a;在醫學領域&#xff0c;科技的進步一直是改變人類生活的關鍵驅動力之一。隨著深度學習技術的不斷發展&#xff0c;其在醫學影像診斷領域的應用正日益受到關注。結直腸癌是一種常見但危害極大的惡性腫瘤&#xff0c;在早期發現和及時治療方面具有重要意義。然而…