走迷宮(詳細分析)

目錄

一、課題描述

輸入樣例:

輸出樣例:

二、需求分析

輸入的形式和輸入值的范圍:

輸出的形式:

程序所能達到的功能:

三、概要設計

四、流程圖

五?、代碼+詳細注釋

六、測試數據和結果


一、課題描述

以一個 m*n 的方陣表示迷宮,0 和 1 分別表示迷宮中的通路和障礙。設計一個程序,對任意設定的迷宮,求出一條從入口到出口的最短通路,或得出沒有通路的結論。

輸入樣例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
輸出樣例:
8

二、需求分析

本設計程序用C++ 編寫,完成二維數組迷宮的生成,找到走出迷宮的最短路徑,或者返回沒有通路的結論。

  • 輸入的形式和輸入值的范圍:

  • 輸入格式:第一行包含兩個整數 n 和 m。接下來 n行,每行包含 m 個整數(0 或 1),表示完整的二維數組迷宮。數據范圍:1≤n,m≤100。
  • 輸出的形式:

  • 輸出一個整數,表示從左上角移動至右下角的最少移動次數。

???程序所能達到的功能:

? ? 1.找到一條從入口到出口的最短通路2.如果迷宮內沒有通路,則返回沒有通路的結論。

三、概要設計

1 )數據邏輯結構、存儲結構分析:

(1 ) 數據邏輯結構:

在迷宮求解的問題中,我運用了隊列這種線性結構來存儲最新到達的地點,隊頭出隊即表示該點走向下一個結點。

(2 )存貯結構分析:

在迷宮求解的問題中,我運用了隊列這種順序結構,隊列在這個代碼中的作用是實現廣度優先搜索算法(BFS)。BFS是一種圖遍歷算法,用于在圖或二維網格中尋找最短路徑或解決某些問題。

2 )本程序包含2 個函數:

(1 )廣度優先搜索算法函數bfs()

  1. 參數描述:

g[N][N]:存貯迷宮信息

d[N][N]:存貯各個點到起始點的路徑長度

PII q[N*N],hh,tt:模擬隊列,PII q[N*N]:存貯隊列中的數據,hh:隊頭,tt:隊尾

Dx:代表這個點在x軸的偏移量,dy:代表這個點在y軸的偏移量

  1. 功能描述

初始化隊列:將起始點排入隊列中,即{0,0}。

初始化d數組:將d數組初始化為-1,從而在bfs搜索時能判斷出這個點是否被搜索過

初始化dx數組和dy數組:即存貯x和y上下左右移動時的偏移量

For循環判斷:將這個點進行上下左右四次移動,如果它在我的二維數組迷宮里面(未超出范圍)并且移動之后點的值等于0(能夠通行)而且是第一次通過(最短路),我就將它入隊,并且記錄它距離下一個點的距離加1,然后就是一個循環過程,只要我的隊里有元素,就說明還未找到最短路。

(2 )主函數main()

  1. 參數描述

M,n:代表m行n列的迷宮

Flag:判斷迷宮中是否有通路

  1. 功能描述

初始化迷宮:輸入m行n列的迷宮

判斷返回值:將bfs得到的結果進行判斷,如果我的迷宮出口距離起始點不是-1的話(已經被搜索到過),那我就返回最短路徑,否則返回沒有通路。

流程圖

五?、代碼+詳細注釋

#include <iostream>
#include <algorithm>
#include <cstdio>using namespace std;typedef pair<int, int>PII;const int N = 110;
//定義一些全局變量
//n,m n行m列
//g數組 存貯迷宮
//d數組 存貯點到起始點的距離
//q二元組 存貯隊列元素點的數據
int n, m;
int g[N][N];
int d[N][N];
PII q[N * N];//重點!bfs的實現
int bfs()
{//隊頭hh,隊尾ttint hh = 0, tt = 0;//隊頭起始點{0,0}q[0] = { 0,0 };//memset函數,將d數組初始化為-1,主要是用于后面判斷此點是否被用過memset(d, -1, sizeof d);//將起始點距離初始化為0d[0][0] = 0;//用數組dx和dy分別存貯x和y和偏移量int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };//只要我的隊列中有元素,就說明廣度搜索沒搜索完while (hh <= tt){//將隊頭元素彈出賦值給t//auto t其實就等于pair<int,int> t(auto 就是讓系統自己猜出t的變量類型,不需要我寫出冗雜的代碼)auto t = q[hh++];//將隊頭彈出的點進行上下左右四次偏移for (int i = 0; i < 4; i++){//t.first即指pair這個二元組前一個元素,t.second即后一個元素//這一步就是得到移動后x,y的坐標int x = t.first + dx[i], y = t.second + dy[i];//判斷移動后的點是否能入隊//x >= 0 && x < n && y >= 0 && y < m首先這個點不能超出我的迷宮邊界//g[x][y] == 0 其次這個點得是我能通行的(即在這個迷宮上這個點的值為0)//d[x][y] == -1 由于我上面有過的初始化,所以d[x][y] == -1時代表這個點第一次被搜索//下一次搜索到這個點我就不要了,就不是最短路徑了if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1){//用d數組記錄點到起始點的距離d[x][y] = d[t.first][t.second] + 1;//最后將bfs搜索到的點入隊,進行下一次搜索q[++tt] = { x,y };}}}//最后返回終點距離起始點的距離return d[n - 1][m - 1];
}int main()
{cin >> n >> m;//輸入我的迷宮for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)cin >> g[i][j];//用flag接收bfs函數返回的值int flag = bfs();//如果返回的值等于-1的話,說明我的bfs并沒有搜索到最后的出口,即這條迷宮沒有通路//反之則有通路,并且是最短通路if (flag!=-1) cout << flag << endl;else cout << "此迷宮中,沒有道路能走出去" << endl;return 0;
}

、測試數據和結果

測試數據1

測試結果:

測試數據2:

測試結果:

測試數據3:

測試數據4:

測試結果:

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

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

相關文章

freeswitch webrtc video_demo客戶端進行MCU的視頻會議

系統環境 一、編譯服務器和加載模塊 二、下載編譯指定版本video_demo 三、配置verto.conf.xml 1.修改配置文件 2.重新啟動 四、MCU通話測試 1.如何使用video_demo 2.測試結果 五、MCU的通話原理及音頻/視頻/布局/管理員等參數配置 附錄 freeswitch微信交流群 系統環境 lsb_rel…

MyBatis處理映射關系

在Mybatis實現數據處理過程中&#xff0c;字段名符合數據庫的規則&#xff0c;屬性一般為駝峰規則&#xff0c;因此字段名和屬性名通常不一致&#xff0c;此時可以通過以下兩種方式對數據庫字段進行映射處理&#xff1a; 為字段起別名&#xff0c;保證和實體類中的屬性名一致在…

lv11 嵌入式開發 IIC(下) 20

目錄 1 Exynos4412下IIC控制器介紹 1.1 總覽 1.2 特征 1.3 工作框圖 1.4 其他內容介紹 1.5 四種工作模式寄存器流程 2 IIC寄存器詳解 2.1 概述 2.2 控制寄存器 2.3 狀態寄存器 2.4 地址寄存器 2.5 數據寄存器 2.6 其他寄存器 3 MPU06050 3.1 簡介 3.2 MPU6050主…

HJ103 Redraiment的走法

題目&#xff1a; HJ103 Redraiment的走法 題解&#xff1a; dfs 暴力搜索 枚舉數組元素&#xff0c;作為起點如果后續節點大于當前節點&#xff0c;繼續向后搜索記錄每個起點的結果&#xff0c;求出最大值 public int getLongestSub(int[] arr) {int max 0;for (int i 0…

data_loader返回的每個batch的數據大小是怎么計算得到的?

data_loader是一個通用的術語&#xff0c;用于表示數據加載器或數據批次生成器。它是在機器學習和深度學習中常用的一個概念。 一、data loader 數據加載器&#xff08;data loader&#xff09;是一個用于加載和處理數據集的工具&#xff0c;它可以將數據集劃分為小批次&#…

提示(Prompt)工程中提示詞的開發優化基礎概念學習總結

本文對學習過程進行總結&#xff0c;僅對基本思路進行說明&#xff0c;結果在不同的模型上會有差異。 提示與提示工程 提示&#xff1a;指的是向大語言模型輸入的特定短語或文本&#xff0c;用于引導模型產生特定的輸出&#xff0c;以便模型能夠生成符合用戶需求的回應。 提示…

內存學習——堆(heap)

目錄 一、概念二、自定義malloc函數三、Debug運行四、heap_4簡單分析4.1 heap管理鏈表結構體4.2 堆初始化4.3 malloc使用4.4 free使用 一、概念 內存分為堆和棧兩部分&#xff1a; 棧&#xff08;Stack&#xff09;是一種后進先出&#xff08;LIFO&#xff09;的數據結構&…

AVFormatContext封裝層:理論與實戰

文章目錄 前言一、封裝格式簡介1、FFmpeg 中的封裝格式2、查看 FFmpeg 支持的封裝格式 二、API 介紹三、 實戰 1&#xff1a;解封裝1、原理講解2、示例源碼 13、運行結果 14、示例源碼 25、運行結果 2 四、 實戰 2&#xff1a;轉封裝1、原理講解2、示例源碼3、運行結果 前言 A…

文章解讀與仿真程序復現思路——電力系統自動化EI\CSCD\北大核心《考慮電力-交通交互的配電網故障下電動汽車充電演化特性》

這個標題涉及到電力系統、交通系統和電動汽車充電的復雜主題。讓我們逐步解讀&#xff1a; 考慮電力-交通交互的配電網故障&#xff1a; 電力-交通交互&#xff1a; 指的是電力系統和交通系統之間相互影響、相互關聯的關系。這可能涉及到電力需求對交通流量的影響&#xff0c;反…

回溯算法之N皇后

一 什么是回溯算法 回溯算法&#xff08;Backtracking Algorithm&#xff09;是一種用于解決組合優化問題的算法&#xff0c;它通過逐步構建候選解并進行驗證&#xff0c;以尋找所有滿足特定條件的解。回溯算法通常應用于在給定約束條件下枚舉所有可能解的問題&#xff0c;如…

Git—文件添加查看刪除修改

目錄 1.添加文件—場景一 2.查看.git文件 3.添加文件—場景三 4.修改文件 5.版本回退 6.撤銷修改 7.刪除文件 1.添加文件—場景一 在包含.git的目錄下新建?個ReadMe文件&#xff0c;我們可以使用 git add 命令可以將文件添加到暫存 區&#xff1a; ●添加一個或多個文…

Matlab數學建模算法之小波神經網絡詳解

&#x1f517; 運行環境&#xff1a;Matlab &#x1f6a9; 撰寫作者&#xff1a;左手の明天 &#x1f947; 精選專欄&#xff1a;《python》 &#x1f525; 推薦專欄&#xff1a;《算法研究》 &#x1f510;#### 防偽水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

vue的屬性

key 預期&#xff1a;number | string | boolean (2.4.2 新增) | symbol (2.5.12 新增) key 的特殊 attribute 主要用在 Vue 的虛擬 DOM 算法&#xff0c;在新舊 nodes 對比時辨識 VNodes。如果不使用 key&#xff0c;Vue 會使用一種最大限度減少動態元素并且盡可能的嘗試就地…

2022藍橋杯c組求和

題目名字 求和 題目鏈接 題意 輸入的每個數都要兩兩相乘&#xff0c;然后再加起來&#xff0c;求最后總和&#xff1b; 思路 每個數乘這個數的前綴和即可 算法一&#xff1a;前綴和 實現步驟 先把前綴和寫出來再寫for循環每個數都乘以自己的前綴和&#xff1b; 實現步驟 直接…

存儲成本降71%,怪獸充電歷史庫遷移OceanBase

怪獸充電作為共享充電寶第一股&#xff0c;業務增長迅速&#xff0c;以至于業務架構不停地增加組件。在驗證 OceanBase 可以簡化架構并帶來更大的業務價值后&#xff0c;首次嘗試在歷史庫中使用 OceanBase 替代 MySQL&#xff0c;存儲成本降低 71%。本文為怪獸充電運維架構部王…

Docker 入門

Docker 入門 基礎 不同操作系統下其安裝包、運行環境是都不相同的&#xff01;如果是手動安裝&#xff0c;必須手動解決安裝包不同、環境不同的、配置不同的問題 而使用Docker&#xff0c;這些完全不用考慮。就是因為Docker會自動搜索并下載MySQL。注意&#xff1a;這里下載…

【C++】輸入輸出流 ⑥ ( cout 標準輸出流對象 | cout 常用 api 簡介 | cout.put(char c) 函數 )

文章目錄 一、cout 標準輸出流對象1、cout 標準輸出流對象簡介2、cout 常用 api 簡介 二、cout.put(char c) 函數1、cout.put(char c) 函數 簡介2、代碼示例 - cout.put(char c) 函數 一、cout 標準輸出流對象 1、cout 標準輸出流對象簡介 cout 是 標準輸出流 對象 , 是 ostrea…

端口被占用 --- 解決方案

問題描述 加速服務啟動失敗&#xff0c;443端口被magentproc(1576)占用。請關掉占用443端口的程序或者嘗試使用系統代理模式。 問題解決 按下 win R 打開 輸入cmd 輸入命令 netstat -ano | findstr 443 找到 0.0.0.0:443 對應的端口 (1576) 按下 ctrl shift esc, 打開任務管…

綜述 2023-IEEE-TCBB:生物序列聚類方法比較

Wei, Ze-Gang, et al. "Comparison of methods for biological sequence clustering." IEEE/ACM Transactions on Computational Biology and Bioinformatics (2023). https://ieeexplore.ieee.org/document/10066180 被引次數&#xff1a;1&#xff1b;研究背景&am…

力扣題:數字與字符串間轉換-12.13

力扣題-12.13 [力扣刷題攻略] Re&#xff1a;從零開始的力扣刷題生活 力扣題1&#xff1a;442. 數組中重復的數據 解題思想&#xff1a;直接相除即可 class Solution(object):def optimalDivision(self, nums):""":type nums: List[int]:rtype: str"&qu…