算法07 深度優先搜索及相關問題詳解

深搜與廣搜是搜索算法中最常用的兩種算法,通過深度優先搜索解決問題還會用到回溯和剪枝,讓我們一起進入本章,了解深搜的基本概念和模板,并學會解決一些常見問題。

目錄

問題導入

走迷宮問題

如何走?

問題建模

如何表示迷宮地圖等信息呢?

如何表示每次移動的過程?

走迷宮問題參考程序

深度優先搜索概述

解決問題時的注意事項

訓練:迷宮

參考代碼

訓練:全排列問題

參考代碼


問題導入

走迷宮問題

現在有一個3*3的迷宮,小知在迷宮的左上角,迷宮出口在右下角,請你幫小知算一算,他有多少種方案可以走出迷宮(每個格子不能重復走動)。

迷宮中顯示0的點,是不可以走的。小知每次只能到達相鄰的上下左右4個格子。

如何走?

1.如果當前出發的格子是終點,則程序結束。

2.每次可以選擇的格子有:上(A)、下(B)、左(C)、右(D)。

3.按照順序嘗試每個格子是否可走。

4.找到第一個可以走的格子(假設為B),標記該格子,表示已經走過。

5.再從格子(B)出發,重復上述過程(遞歸進行)。

6.將格子(B)消除標記,再嘗試從格子(C、D)出發去找路線。

?

問題建模

如何表示迷宮地圖等信息呢?

使用一個3*3的二維數組maze[][]來存儲迷宮信息,如果值位0表示不可走,1表示可走。

使用一個3*3的二維數組used[][]來標記是否走過,沒走過為0,走過的話為1。

例:used[1][2]=1,表示maze[1][2]已經走過。

如何表示每次移動的過程?

每次移動,實際上就是坐標的變化。

上:行標-1,列標不變。

下:行標+1,列標不變。

左:行標不變,列標-1。

右:行標不變,列標+1。

我們可以用一個二維數組表示移動的方向。

例:當前坐標為(1,2),向上移動就是:(1+fx[0][0],2+fx[0][1]),得到(0,2)。

?

走迷宮問題參考程序

int ans=0,maze[6][6],used[6][6],fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int x,int y){if(x==3&&y==3){ //如果當前找的點就是終點,則方案數+1,結束本次搜索。ans++; return ;}else{used[x][y]=1;  //將當前所在的點標記為1,表示走過for(int i=0;i<4;i++) { //嘗試上、下、左、右4個方向int nx=x+fx[i][0];int ny=y+fx[i][1]; //下一次查找的點的坐標nx,ny//nx,ny要在地圖內,并且可走,并且未被走過。if(nx>=1&&nx<=3&&ny>=1&&ny<=3&&used[nx][ny]==0&&maze[nx][ny]==1){used[nx][ny]=1;  //表示nx,ny表示走過dfs(nx,ny); //從nx,ny再去找used[nx][ny]=0; //消除標記,再嘗試其他方向。}}used[x][y]=0; //消除標記}
}int main(){for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){cin>>maze[i][j];}}dfs(1,1);cout<<ans;return 0;
}

深度優先搜索概述

我們走迷宮的過程就是一個深度優先搜索的過程:從可以解決問題的某一個方向出發,并一直深入尋找,找到這個方向可以得到的所有解決方案,如果找不到,則回退到上一步,從另一個方向開始,再次深入尋找。

解決問題時的注意事項

1.首先弄清楚問題的解空間,即迷宮有多大。

2.弄清楚搜索的邊界,即到哪一步就該停下,不用再搜。

3.搜索的方向,即可能包含哪幾種子問題。

void dfs()//參數用來表示狀態  
{  if(到達終點狀態){  ...//根據題意添加  return;  }  if(越界或者是不合法狀態)  return;  if(特殊狀態)//剪枝return ;for(所有可能的下一狀態){  if(狀態符合條件){  修改操作;//根據題意來添加  標記;  dfs();  (還原標記);  //是否還原標記根據題意  //如果加上(還原標記)就是 回溯法  }  }  
}

訓練:迷宮

給定一個N*M方格的迷宮,迷宮里有T處障礙,障礙處不可通過。給定起點坐標和終點坐標,問: 每個方格最多經過1次,有多少種從起點坐標到終點坐標的方案。在迷宮中移動有上下左右四種方式,每次只能移動一個方格。數據保證起點上沒有障礙。

【輸入描述】第一行N、M和T,N為行,M為列,T為障礙總數。第二行起點坐標SX,SY,終點坐標FX,FY。接下來T行,每行為障礙點的坐標。

【輸出描述】給定起點坐標和終點坐標,問每個方格最多經過1次,從起點坐標到終點坐標的方案總數。

【輸入樣例】2 2 1

1 1 2 2

1 2

【輸出樣例】1

參考代碼

#include<bits/stdc++.h>
using namespace std;int ans=0,maze[6][6],used[6][6];
int Fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m,t,sx,sy,fx,fy,tx,ty;void dfs(int x,int y,int s,int e){if(x==s&&y==e){ans++; return ;}else{used[x][y]=1;for(int i=0;i<4;i++) {int nx=x+Fx[i][0];int ny=y+Fx[i][1];if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&used[nx][ny]==0&&maze[nx][ny]==0){ used[nx][ny]=1;dfs(nx,ny,s,e);used[nx][ny]=0;}}used[x][y]=0;}
}int main(){cin>>n>>m>>t;cin>>sx>>sy>>fx>>fy;for(int i=1;i<=t;i++){cin>>tx>>ty;maze[tx][ty]=1;}dfs(sx,sy,fx,fy);cout<<ans;return 0;
}

訓練:全排列問題

輸入整數n(n<=9),輸出1~n的所有排列方式。

例:n=3,全排列為123,132,213,231,312,321。

【輸入描述】輸入一個正整數n

【輸出描述】輸出1~n之間的全排列(n<=9),換行輸出

【輸入樣例】3

【輸出樣例】123

132

213

231

321

312

參考代碼

int ans[10],used[10];
void dfs(int x,int n){if(x>n){for(int i=1;i<=n;i++)cout<<ans[i];cout<<endl;return;}for(int i=1;i<=n;i++){if(!used[i]){ans[x]=i;used[i]=1;dfs(x+1,n);used[i]=0;}}
}
int main(){int n;cin>>n;dfs(1,n);return 0;
}

從入門到算法,再到數據結構,查看全部文章請點擊此處??icon-default.png?t=N7T8http://www.bigbigli.com/?

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

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

相關文章

python ----- xml 命名空間與xpath詳解

一、簡介 本文章以如下xml 樣例進行講解命名空間和xpath xml_text"""<?xml version"1.0"?><actors xmlns:fictional"http://characters.example.com"xmlns"http://people.example.com"><actor><name>…

SpringBean的管理

一、bean的名字與標識符 <bean id"" class""></bean> bean的名字作用: 獲取這個bean通過bean名字獲取 bean名字配置方式: id: 唯一標志符, 命名規范與變量命名規范一樣, 包含特殊符號name: 配置名字: 可以包含特殊符號,沒有要求, 比如. 一…

基于支持向量機的垃圾郵件分類,使用SVM+flask+vue

sms-classify 基于支持向量機的垃圾郵件分類&#xff0c;使用SVMflaskvue 數據集和源碼地址 數據集 SMS Spam Collection Data Set 來源于 UCI。樣例被分為非垃圾郵件&#xff08;86.6%&#xff09;和垃圾郵件&#xff08;13.4%&#xff09;&#xff0c;數據格式如下&#xff…

網絡爬蟲中Xpath的使用方法

正則表達式雖然可以處理包含了諸如 HTML 或 XML 內容的字符串&#xff0c;但只能根據文本的 特征匹配字符串&#xff0c;而忽略字符串所包含的內容的真實格式。為了解決這個問題&#xff0c;Python 引入 XPath 以及支持 XPath 的第三方庫 lxml&#xff0c;專門對 XML 或 HTML 格…

git 合并master到分支

master分支的代碼領先自己的分支,git 如何把master分支代碼合并到自己的分支 1.首先切換到主分支 git checkout master 2.使用git pull 把領先的主分支代碼pull下來 git pull 3.切換到自己的分支 git checkout xxx(自己的分支) 4.把主分支的代碼merge到自己的分支 git merge ma…

minio+tusd+uppy搭建文件上傳服務

1、docker部署minio、tusd服務 1.1 新建docker-compose.yml minio API: http://ip:9100 minio控制臺: http://ip:9101 tus API: http://ip:9102/files/ tus webhooh: http:172.0.0.1:3000/files/webhooh(用戶鑒權API) version: 3.7services:minio:image: minio/minio:RELEAS…

亞馬遜運營專詞(一)

許多新入駐亞馬遜的大陸賣家&#xff0c;對亞馬遜的專業詞匯還不太了解&#xff0c;導致在運營店鋪的過程出現一些問題&#xff0c;今天就來講解一下亞馬遜常用的運營專詞&#xff0c;方便新手賣家深入了解。 1. Listing&#xff1a;亞馬遜listing指的是產品的詳情頁面&#xf…

通過BLE實現類似UART的串行通信:NUS服務 vs GATT服務

在物聯網和智能設備的發展中&#xff0c;藍牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;技術已經成為無線數據傳輸的重要手段。本文將介紹通過BLE實現類似UART的串行通信&#xff0c;并對比NUS服務和GATT服務的使用場景&#xff0c;幫助開發者更好地選擇適合的技…

2024越南醫藥、制藥機械展

2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會 時間&#xff1a; 2024年11月21--23日 地點&#xff1a;越南胡志明市-西貢會展中心SECC 2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會將于2024年11月21-23日在越南胡志明市盛大舉行&#xff01;展覽會以國際化、專…

【Feature Pyramid Networks for Object Detection】

Feature Pyramid Networks for Object Detection 摘要引言2 相關工作3 FPN4 應用摘要 特征金字塔是識別系統中用于檢測不同尺度對象的基本組件。但是,最近的深度學習對象檢測器已經避免了金字塔表示,部分原因是它們在計算和內存方面都很密集。在這篇論文中,我們利用深度卷積…

LeetCode經典題之876、143 題解及延伸

系列目錄 88.合并兩個有序數組 52.螺旋數組 567.字符串的排列 643.子數組最大平均數 150.逆波蘭表達式 61.旋轉鏈表 160.相交鏈表 83.刪除排序鏈表中的重復元素 389.找不同 1491.去掉最低工資和最高工資后的工資平均值 896.單調序列 206.反轉鏈表 92.反轉鏈表II 141.環形鏈表 …

paddleocr查看標注好的數據錯誤信息

字符計數 import os import json from collections import Counter# 按字符計數 label_dir"/Users/thy/Downloads/chinese20240613" zi_ls[] with open(os.path.join(label_dir,"Label.txt")) as f:linesf.readlines()for line in lines:line line.strip…

Java面試題:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 將數據的存儲和索引放在一塊,索引結構的葉子節點保存了行數據 索引字段必須存在,且只能存在一個 非聚集索引(二級索引) 將數據和索引分開存儲,索引結構的葉子節點關聯的是對應的主鍵 索引字段可以存在多個 索引的選取規則 如果…

【學習】常用的分類網絡

1. LeNet 提出時間&#xff1a;1998年最新版本&#xff1a;原始版本使用的數據集格式&#xff1a;MNIST&#xff08;28x28灰度圖像&#xff09;優點&#xff1a; 結構簡單&#xff0c;易于理解和實現。對于小規模圖像數據集&#xff08;如MNIST&#xff09;有很好的表現。缺點…

豆瓣高分項目管理書籍推薦

&#x1f4ec;豆瓣網站上有很多項目管理領域的書籍獲得了較高的評分&#xff0c;以下是一些高分項目管理書籍的精選列表&#xff0c;發出來跟大家分享一下&#xff1a; 《項目管理知識體系指南&#xff08;PMBOK指南&#xff09;》 【內容簡介】這本書是美國項目管理協會&…

opencv檢測圖片上七種顏色,分辨顏色和對應位置

opencv檢測圖片上七種顏色&#xff0c;分辨顏色和對應位置 讀取圖片&#xff1a;使用cv2.imread()函數讀取目標圖片。 轉換顏色空間&#xff1a;通常在HSV顏色空間中進行顏色檢測&#xff0c;因為HSV顏色空間更適合描述顏色的屬性。 定義顏色范圍&#xff1a;為七種顏色定義…

RabbitMQ 修改默認密碼

RabbitMQ的一些常用命令 #啟動rabbitmq service rabbitmq-server start# 查看rabbitMQ的運行狀態 service rabbitmq-server status# 開啟rabbitMQ的后臺管理插件 rabbitmq-plugins enable rabbitmq_management # 重啟RabbitMQ服務 service rabbitmq-server restart RabbitMQ的…

AcWing 797:差分 ← 一維差分模板題

【題目來源】https://www.acwing.com/problem/content/799/【題目描述】 輸入一個長度為 n 的整數序列。 接下來輸入 m 個操作&#xff0c;每個操作包含三個整數 l,r,c&#xff0c;表示將序列中 [l,r] 之間的每個數加上 c。 請你輸出進行完所有操作后的序列。【輸入格式】 第一…

富格林:正規操作實現穩健出金

富格林認為&#xff0c;當下的金融市場&#xff0c;投資者進行理財都會特別關注盈利效率高的產品&#xff0c;而近年來興起的現貨黃金&#xff0c;其高效的盈利效率吸引著大批朋友關注。不過&#xff0c;要想在這盈利出金&#xff0c;就得學習掌握正規的交易策略。下面富格林將…

onnx模型修改:去掉Dropout層

文章目錄 嘗試1&#xff1a;強行設置dropout層train mode為False嘗試2&#xff1a;找到onnx模型中的dropout, train mode設置為False嘗試3&#xff1a;直接刪除dropout層&#xff0c;連接其輸入輸出結語 最近訓練模型使用了tinyvit&#xff0c;性能挺強的&#xff1a; 但是導出…