藍橋杯算法之搜索章 - 2

大家好,接下來,我將帶來對于搜索篇的新內容,這部分我將打算圍繞DFS深度優先搜索去講解。

溫馨提示:由于這篇文章是接著上一篇文章的,如果新讀者沒有看過前一篇的話,推薦去看一下,不然有些地方可能會不懂。

接下來的每道題我相信大家都會有所收獲的!

1.題目概述:

這部分我將講解以下有關DFS的題目

1.選數 ---?P1036 [NOIP 2002 普及組] 選數 - 洛谷

2.飛機降落 ---?P9241 [藍橋杯 2023 省 B] 飛機降落 - 洛谷

3.八皇后 ---?P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷

4.數獨 ---?P1784 數獨 - 洛谷

這部分的題比上篇文章的題難度要提高挺多,大家可以如果有所困難可以多多思考一下。

2.選數

大家會發現,如果看了我前面的算法篇1的話其實很容易解決dfs遞歸的內容的。

但是大家會發現這里有一個新問題:如何求解一個數是不是素數呢?

這個的話有挺多的方法的,我在這里就用了一個簡單的方法

比如判斷一個數x是不是素數,由素數的定義我們可以知道:素數是大于1的正整數,而且只能被自己和1整除。

那么我們就可以從2開始到x所有的數拿去試除即可解決。

但是要判斷的這些數有點多了,我們就可以去選擇試除到根號x即可,具體的原因網上有證明,有興趣的讀者可以去看看。

(如果想判斷大量數字是否為素數,可以采用埃拉托色尼篩選法

大家在看題目,發現結果并不會因為數字的順序不同而改變,所以是一種組合。

我們就得在dfs的參數中加入一個begin參數來表示從哪個數開始的

首先我們畫一下這個決策樹:

我們根據自己畫的決策樹就可以來寫代碼了:

當然這道題跟上篇文章中的思路是一樣的,回溯遞歸

3.飛機降落

這道題的難度就比較高了,大家好好理解一下題目,可以嘗試做一做

那跟著博主的思路一起來看一下這道題吧。

這道題會發現的是如果直接來做的話,要安排好每架飛機的順序,保證該組飛機能夠安全降落,那么如果怎么都安排不出來,就代表這個不能及時降落了。所以如何安排順序就是我們的問題了

我們這時候就可以通過搜索去枚舉出來所有情況。而且數據也是比較小的,通過搜索去做也不會出現超時,很顯然也在暗示我們去搜索。

由于這道題的枚舉類似排列,所以我們就不需要一個begin值去告訴該從什么位置遞歸了。

對于安排過的飛機,我們只需要通過一個bool st[]數組去標記一下即可。

當遇到了標記過的飛機就直接剪掉這個分支。

上一架飛機結束時間需要記錄一下,因為上一架飛機結束時間 ?>? 新飛機到達時間 + 最長盤旋時間,就代表了新飛機無法降落,我們也將這個分支給剪掉。

?那對于新飛機的結束時間怎么計算呢?

1.新飛機到達時間 >= 前一架飛機結束時間(新飛機到達的時間晚于前一架飛機的結束)

? ? ? ? 那么新飛機結束時間 = 新飛機的到達時間? ?+? ?新飛機的降落時間

2.新飛機到達時間 < 前一架飛機結束時間

? ? ? ? 比較一下

????????????????新飛機到達時間 + 盤旋時間? ?是否大于等于???前一架飛機結束時間

? ? ? ? 如果是 ---->? 新飛機能正常降落 ---- 新飛機結束時間 = 前一架飛機結束時間 + 新飛機降落時間

? ? ? ? 如果不是 ---> 新飛機無法正常降落

所以新飛機的結束時間? =? max(前飛機的結束時間, 新飛機到達時間) + 新飛機降落時間

根據博主的思路大家好好想想,將這個條件理解后,我們就可以來實現代碼了。

讀者可以先嘗試寫一下

這樣就可以實現出這到題了

大家可以仔細理解一下。

4.八皇后

大家還是可以先自己做一下,看看有哪里不懂的。

接下來就跟著博主的思路來理一下這道題吧,我們看完這道題后,我們知道的是什么呢?

我們無非就是要往這個矩陣中填棋子,將解的個數輸出即可。

我們對應的布局就如下面這樣

對應的246135數字都為對應的1,2,3,4,5,6行對應的列

所以我們有了對應的數字246135就可以得到對應的棋局布置了

我們可以發現數據并不是很大,我們就可以去嘗試枚舉所有的情況了,將所有棋子的填充情況都枚舉一遍不就解決了嗎?

我們要填數肯定也有對應的限制了,那么限制是什么呢?

題目有說:行、列、對角線至多只能有一個棋子

所以我們通過這個條件就能夠減少我們枚舉的個數

我們簡單畫一下決策樹來:

這里并沒有畫完,大概理解一下,我們只要遍歷填充即可

大概邏輯還是dfs將結果存放起來

我們發現,其實要知道對應的行列有沒有放棋子很簡單的,由于放了1行,那么只能從2行開始放置了。所以我們只要用循環一行一行的放即可,我們再創建一個bool col[N]數組去標記哪些列被標記了。如果對應的列被放了就跳過它。

那么對角線如何解決呢?

我們可以使用一次函數來解決它。以向下的行數為x軸,向右的列為y軸,每個對角線都有自己的一個表達式:

我們對于一個坐標位置就有兩條對角線:y - x = n? ? ?y + x = n

如果滿足y - x = n或者y + x = n就代表對應的對角線已經有了棋子了!

我們只要將填過棋子的 y - x 和 y + x得到的值放在對應的數組就可以標記對角線了

但是有可能y - x會出現負數?怎么解決呢?

我們只要給y - x加上一個n值(偏移量)即可

現在bool? st[2 * N];就可以標記對角線了,而且由于每個節點會出現兩條對角線,所以要空間要開辟2 * N的大小!

我們需要統計前幾個結果的路徑所以還得用vector<int> path去標記成功的結果。

現在我們就來寫一下代碼吧:

大家可以好好理解一下這段代碼,再和博主我的思路畫圖結合一起來分析。

大家理解了其中的主要思維,就能夠自己寫出來了

5.數獨

這道題題目講的很簡單給出一個未知的數獨,然后讓我們把它填完,再輸出即可。

大家還是一樣可以先自己思考一下該如何解決!

下面跟著博主的思路來看看這道題吧:

首先我們會接收到一個二維數組,這里面會有很多0,這些0就是我們需要去填充的部分

?對于每個0我們都可以在1---9的數字去填充

但是會因為其他已經有了數字的位置導致有些數不能填。

玩過數獨的都知道,我們每行都是要在1-9去填充,3 * 3的格子內也得要在1--9

對于對應的行列,我們可以使用一個二維數組去標記第幾行的哪幾個數被填過,第幾列的哪些數被填過。

bool row[N][N]? ----------? ?row[i][x]表示第x行的i數被填充過

bool col[N][N]? ?----------? ?col[i][y]表示第y列的i數被填充過

那么對于這個3 * 3的格子怎么解決呢?

我們看看下面的圖:

我們只要下標從 0 --- 8來標記數組,就可以通過對應的下標除以3就可以得到是第幾個3 * 3的小格子

對應的這9 * 9的數獨就有9個3 * 3的格子,就可以用對應點的x, y通過x / 3 , y / 3去找到對應的3 * 3格子

我們創建一個三維數組st來標記即可解決了

bool st[N][N][N]? ?-----? ?st[x / 3][y / 3][i] ---- 就代表第x / 3,行y / 3列的3 * 3格子中填充了數i

現在我們最困難的地方已經解決,現在就是寫代碼的階段,讀者可以跟著思路自己去寫一下!

代碼如下:

這道題中dfs里面還多出來了個判斷y和x的合法性的判斷,這個地方需要特別注意一下。

6.結語

很高興大家能夠看到這里,這一部分的題難度有所提高,大家要好好思考思考。

好好理解其中的思考過程,相信大家會有所收獲的。

后面我會持續更新,大家多多點贊收藏+關注。

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

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

相關文章

藍橋杯----AT24C02

&#xff08;5-1&#xff09;、AT24C02掉電不丟失寫入與讀取AT24C02就是將數據寫入E2PROM&#xff0c;保證寫入數據掉電不丟失。考頻低&#xff0c;一般不考&#xff0c;頂天考幾個數據E2PROM&#xff0c;上電立馬讀取。AT24C02數據讀取一定放在主程序最前面&#xff0c;否則會…

【物聯網】基于樹莓派的物聯網開發【19】——樹莓派搭建MQTT客戶端及MQTTX使用

場景介紹 實現測試客戶端與 MQTT 服務器的連接、訂閱、取消訂閱、收發消息等功能。 MQTT發布消息到代理服務器 安裝paho-mqtt 使用pip工具安裝paho-mqtt&#xff0c;輸入以下指令即可&#xff1a; sudo pip install paho-mqtt安裝 MQTT 客戶端庫 為了方便連接到 MQTT 服務器&am…

5G-A技術浪潮勾勒通信產業新局,微美全息加快以“5.5G+ AI”新勢能深化場景應用

7月31日&#xff0c;國家互聯網信息辦公室發布《國家信息化發展報告》。《報告》中提出&#xff0c;新一代通信技術研發取得新成果&#xff0c;5G-A地空通信&#xff08;5G-ATG&#xff09;技術研發成功并完成測試驗證。5G-A技術研發測試驗證移動通信技術一般代際生命周期為10年…

SQLite Where 子句詳解

SQLite Where 子句詳解 SQLite 是一款輕量級的數據庫管理系統,廣泛應用于移動設備、嵌入式系統以及個人電腦。在 SQLite 中,WHERE 子句是 SQL 查詢語句中不可或缺的一部分,它用于指定查詢條件,從而篩選出滿足特定條件的記錄。本文將詳細介紹 SQLite 中的 WHERE 子句,包括…

AI IDE+AI 輔助編程-生成的大綱-一般般

引言概述 AI IDE 和 AI 輔助編程的興起及其對開發效率的影響提出核心問題&#xff1a;AI 工具能否真正幫助程序員減少加班&#xff08;告別 996&#xff09;&#xff1f;AI IDE 與 AI 輔助編程的定義與現狀解釋 AI IDE&#xff08;集成 AI 的開發環境&#xff09;和 AI 輔助編程…

ABP VNext + Dapr Workflows:輕量級分布式工作流

&#x1f680; ABP VNext Dapr Workflows&#xff1a;輕量級分布式工作流 &#x1f4da; 目錄&#x1f680; ABP VNext Dapr Workflows&#xff1a;輕量級分布式工作流一、引言 ?TL;DR &#x1f525;二、環境與依賴 &#x1f6e0;?三、系統架構與流程圖 &#x1f3d7;?四、…

? Unity 實現UI視差滾動效果(Parallax)鼠標控制、可拓展陀螺儀與腳本控制

? 效果如下在許多游戲、APP 或動效頁面中&#xff0c;我們常見的一種視覺效果是 視差滾動&#xff08;Parallax Scrolling&#xff09;&#xff1a;前景、中景、背景在鼠標或設備移動時以不同速率輕微移動&#xff0c;從而營造出一種空間感和深度感。目前遇到這樣一個需求 所以…

【05】VM二次開發——模塊參數配置--帶渲染/不帶渲染(WinForm界面調用 模塊參數配置)

文章目錄1 Winform 窗口界面 &#xff08;帶渲染的參數配置控件&#xff09;2 配置代碼3 運行測試4 不帶渲染的參數配置控件 對比4.1 添加控件4.2 代碼及演示效果模塊參數配置本教程介紹如何在VM二次開發中對模塊參數進行配置 1 Winform 窗口界面 &#xff08;帶渲染的參數配置…

Android 之 藍牙通信(2.0 經典)

??一、環境配置??1. ??添加依賴??在 build.gradle 中添加庫依賴&#xff1a;dependencies {implementation com.github.akexorcist:bluetoothspp:1.0.0 }2. ??權限聲明&#xff08;AndroidManifest.xml&#xff09;?<uses-permission android:name"androi…

使用 Scikit-LLM 進行零樣本和少樣本分類

使用 Scikit-LLM 進行零樣本和少樣本分類 使用 Scikit-LLM 進行零樣本和少樣本分類 在本文中&#xff0c;您將學習&#xff1a; Scikit-LLM如何將OpenAI的GPT等大型語言模型與Scikit-learn框架集成以進行文本分析。零樣本和少樣本分類之間的區別以及如何使用Scikit-LLM實現它…

android內存作假通殺補丁(4GB作假8GB)

可過如下app檢測&#xff1a; 安兔兔、魯大師、白眼、AIDA64、CPU X、CPU-Z、DevCheck、DeviceInfoHW lyw235yk235:~/Extend/lyw235/V/sprdroid1_v_4/sprdroid1_v$ git diff vnd/bsp/kernel5.15/kernel5.15/mm/page_alloc.c diff --git a/vnd/bsp/kernel5.15/kernel5.15/mm/pag…

Android 之 MVC架構

介紹1. MVC架構分工????Model層??&#xff1a;處理數據驗證、網絡請求等業務邏輯。??View層??&#xff1a;XML布局定義界面&#xff0c;Activity處理用戶輸入和顯示結果。??Controller層??&#xff1a;Activity作為控制器&#xff0c;協調Model和View的交互對于登…

Centos Docker 安裝手冊(可用)

Centos 安裝 Docker # 卸載舊版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux # 安裝依賴工具 yum install -y yum-utils device-mapper-persistent-d…

烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-強刷卡刷固件包

烽火HG680-KX-海思MV320芯片-28G-安卓9.0-強刷卡刷固件包U盤強刷刷機步驟&#xff1a;1、強刷刷機&#xff0c;用一個usb2.0的8G以下U盤&#xff0c;fat32&#xff0c;2048塊單分區格式化&#xff08;強刷對&#xff35;盤非常非常挑剔&#xff0c;usb2.0的4G U盤兼容的多&…

Python爬蟲實戰:研究pycares技術構建DNS解析系統

1. 引言 1.1 研究背景 隨著互聯網的飛速發展,網絡上的數據量呈現爆炸式增長。網絡爬蟲作為一種高效的數據采集工具,被廣泛應用于數據分析、市場調研、學術研究等領域。傳統的爬蟲在進行大規模數據采集時,往往會受到 DNS 解析效率的制約,成為影響爬取性能的瓶頸之一。 DNS…

從 0 到 1 認識 Spring MVC:核心思想與基本用法(下)

文章目錄&#x1f4d5;4. 響應??4.1 返回靜態頁面??4.2 返回數據ResponseBody???4.3 返回HTML代碼片段???4.4 返回JSON??4.5 設置狀態碼??4.6 設置Header&#xff08;了解&#xff09;&#x1f4d5;5. 案例練習??5.1 加法計算器??5.2 用戶登錄??5.3 留言板…

Python-初學openCV——圖像預處理(五)——梯度處理、邊緣檢測、圖像輪廓

目錄 一、圖像梯度處理 1、垂直邊緣提取 2、Sobel算子 3、Laplacian算子 二、圖像邊緣檢測 1、高斯濾波 2、計算圖像的梯度、方向 3、非極大值抑制 4、雙閾值篩選 三、繪制圖像輪廓 1、概念 2、尋找輪廓 3、繪制輪廓 一、圖像梯度處理 還記得高數中的一階導數求極值…

【Redis】安裝Redis,通用命令,常用數據結構,單線程模型

目錄 一.在Ubuntu系統安裝Redis 二. redis客戶端介紹 三. 全局命令 3.1.GET和SET命令 3.2.KEYS&#xff08;生產環境禁止使用&#xff09; 3.3.EXISTS 3.4.DEL 3.5.EXPIRE 3.6.TTL 3.6.1.Redis的過期策略 3.6.2.基于優先級隊列/堆的實現去實現定時器 3.6.3.定時器&a…

ubuntu22.04系統實踐 linux基礎入門命令(三) 用戶管理命令

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 之所以推薦給大家使用&#xff0c;是因為上面的云主機目前是免費使用的…

DPDK中的TCP頭部處理

1. TCP頭部結構 TCP頭部通常為20字節&#xff08;不含可選字段&#xff09;&#xff0c;每個字段占據固定的字節位置。以下是TCP頭部的結構&#xff0c;按字節位置逐一說明&#xff1a;0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 …