[數據結構]求解迷宮最短路徑問題

一、問題概述

?????? 之前,我們了解了如何實現迷宮問題(對于迷宮只有一個出口可以通的情況),事實上我們的迷宮有多個出口,對于每條路徑來說,有長有短,所以在這里,我們討論一下迷宮的最短路徑,即迷宮路徑的最優解問題。


二、解決方案


?????? 對于這樣一個迷宮:

???


?? 注:數字為0的表示可以通過,數字為1的表示不可以通過。

?? 從入口坐標:(2,0)開始,可以到達出口位置的通路總共有三條。可想而知,肯定得把每一條路徑都得遍歷一遍,記錄每條路徑的長度。我們這里采用了遞歸的思想。

求解最短路徑的辦法:


(1)將入口點標記起來,給其賦值;


(2)每次訪問的下一個位置就是前一個位置的值+1,直至一條路徑成功通往出口;


(3)如果訪問下一條路徑的時候,遞歸會回退,在這里回退時它還會檢測是否有通路,(上上節講迷宮問題時有具體實現,可以去參照),這時由于我們賦的值已經改變了,所以此時判斷的條件為如果它的下一個位置的值+1>當前的位置的值,它就可以通過。


(4)當每條路徑走完后,會顯示最后出口的值,這樣就知道哪條路徑最短啦。


圖示如下:

??????????????????????????????????????????????


三、實現代碼


//Maze1.h

#include<iostream>
using namespace std;
#include<assert.h>
#include<stack>struct Pos
{int _row;int _col;
};void GetMaze(int *Maze,size_t N)
{FILE* fout = fopen("Maze1.txt","r");assert(fout);for(size_t i = 0; i < N; ++i){for(size_t j = 0; j < N; ){int value = fgetc(fout);if(value == '1' || value == '0'){Maze[i*N+j] = value - '0';++j;}else if(value == EOF){cout<<"Maze error!"<<endl;return;}}}
}bool IsCheckPath(int *maze,size_t n,Pos cur,Pos next)
{if((next._row < 0 || next._row >= 10) || (next._col < 0 || next._col >= 10)||(maze[next._row*n+next._col] == 1)){return false;}if(maze[next._row*n+next._col] == 0){return true;}return maze[next._row*n+next._col]+1 > maze[cur._row*n+cur._col];
}//遞歸
void GetMazePath(int *maze,size_t n,Pos entry,stack<Pos>& s,stack<Pos>& ss)
{Pos cur;Pos next;s.push(entry);next = entry;if(entry._row == n-1){if(ss.empty() || s.size() < ss.size()){ss = s;}s.pop();return;}//探測上下左右//上next = entry;cur = next;next._row-=1;if(IsCheckPath(maze,n,cur,next)){maze[next._row*n+next._col] = maze[cur._row*n+cur._col]+1;GetMazePath(maze,n,next,s,ss);}//右next = entry;cur = next;next._col+=1;if(IsCheckPath(maze,n,cur,next)){maze[next._row*n+next._col] = maze[cur._row*n+cur._col]+1;GetMazePath(maze,n,next,s,ss);}//下next = entry;cur = next;next._row+=1;if(IsCheckPath(maze,n,cur,next)){maze[next._row*n+next._col] = maze[cur._row*n+cur._col]+1;GetMazePath(maze,n,next,s,ss);}//左next = entry;cur = next;next._col-=1;if(IsCheckPath(maze,n,cur,next)){maze[next._row*n+next._col] = maze[cur._row*n+cur._col]+1;GetMazePath(maze,n,next,s,ss);}//四方都不通s.pop();
}void PrintMaze(int *maze,size_t n)
{cout<<"迷宮顯示:>"<<endl;for(size_t i = 0; i < n; ++i){for(size_t j = 0; j < n; ++j){cout<<maze[i*n+j]<<" ";}cout<<endl;}
}

//Maze1.cpp

#include"Maze1.h"//用棧和遞歸實現迷宮問題
const size_t N = 10;void FunTest()
{int Maze[N][N];Pos entry = {2,0};stack<Pos> ss;stack<Pos> ss1;GetMaze((int*)Maze,N);Maze[entry._row][entry._col] = 2;GetMazePath((int*)Maze,N,entry,ss,ss1);cout<<"迷宮是否有出口?"<<!ss.empty()<<endl;PrintMaze((int*)Maze,N);
}int main()
{FunTest();return 0;
}

四、運行結果




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

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

相關文章

centos升級之內核kernel

yum update kernel yum update && yum upgrade # rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm # yum –disablerepo”*” –enablerepo”elrepo-kernel” list ava…

[STL]List的實現

STL&#xff08;Standard template Library&#xff09;:c的標準模板庫 STL是算法和數據結構的軟件框架&#xff0c;它包含了六大組件&#xff1a;算法、迭代器、容器、仿函數、配接器、空間配置器。 迭代器&#xff1a;我們可以把迭代器相當于智能指針&#xff0c;&#xff0…

python 獲取windows上 網絡連接信息 ip dhcp dns gateway

import socket import os import re def get_host_ip():"""查詢本機ip地址:return:"""try:s socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect((8.8.8.8,80))# 能提取出本機ip 通過本機ip提取出其他設置ip s.getsockname()[0]# ip地…

vc++6.0的應用程序打不開腫么辦

今天早起&#xff0c;有同學問到我關于vc6.0的安裝過程中遇到的問題&#xff0c;我聽了之后想想還是寫篇博客給大家看一下吧。因為我之前也遇到過類似的問題。當時也是挺著急的。 大家遇到的問題估計就是這樣吧~~&#xff08;下載后打不開&#xff09; 請看-->解決步驟&…

【數據結構】廣義表

一、問題概述 廣義表是非線性的數據結構&#xff0c;是由若干個元素組合而成的&#xff0c;廣義表中可以有子表&#xff0c;類似這樣的&#xff1a; 我們以C(a,b,(c,d))為例&#xff0c;將它定義為這樣的數據結構&#xff1a; 我們會給定字符串的形式&#xff0c;如&#xff…

centos升級之共享文件夾

vmware-hgfsclient vmhgfs-fuse .host:/share /mnt/hgfs 如果不行的話 cd /mnt mkdir hgfs 把上面的在執行一次

批處理創建程序的快捷方式

"D:\AppServ\timer\win_cron_zq\定時.exe" 這是應用程序timer.lnk" 這是快捷方式的名稱 echo ThePath "D:\AppServ\timer\win_cron_zq\定時.exe">aaa.vbs echo lnkname "timer.lnk">>aaa.vbs echo WS "Wscript.Shell&quo…

【數據結構】普通二叉樹的實現

一、問題概述 樹是n個有限個數據的集合&#xff0c;形如&#xff1a; 它像不像倒著的樹呢&#xff1f;我們把它看成是一種數據結構----樹。它的第一個節點稱作樹的根&#xff0c;最底下的那些節點稱作樹的葉子。 我們今天所要研究的是二叉樹&#xff0c;即父節點最多只有兩個孩…

windows 下 安裝mysql 出現 “ ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password

這個問題是在Windows下安裝MySQL服務時遇到的&#xff0c;使用MySQl綠色版進行安裝的&#xff0c;安裝完成后&#xff0c;連接到MySQL服務時輸入命令 “ mysql -uroot -p ” &#xff0c;因為時第一次登錄&#xff0c;未設置密碼&#xff0c;直接回車&#xff0c;就遇到了這個問…

setitimer用法說明

函數原型&#xff1a; int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value) 函數作用&#xff1a; 可用來實現延時和定時的功能 頭文件&#xff1a; #include <sys/time.h> 參數詳解 用一把&#xff1a;一個例子 #include &…

哈希表(閉散列、拉鏈法--哈希桶)

哈希表&#xff0c;也稱散列表&#xff0c;是一種通過key值來直接訪問在內存中的存儲的數據結構。它通過一個關鍵值的函數&#xff08;被稱為散列函數&#xff09;將所需的數據映射到表中的位置來訪問數據。 關于哈希表&#xff0c;主要為以下幾個方面&#xff1a; 一、哈希表…

僵尸進程的產生和SIGCHLD信號

核心句子 子進程在終止時會給父進程發SIGCHLD信號,該信號的默認處理動作是忽略,父進程可以自 定義SIGCHLD信號的處理函數。 僵尸進程的產生&#xff1a; #include "head.h" #include <unistd.h> #include <signal.h>int main() {key_t key ftok(&quo…

windows 通過批處理 修改環境變量

echo off setlocal enabledelayedexpansion set remain%path% ::待查找字符串 set toAddD:\ffmpeg2\ffmpeg-4.1.3-win64-shared\bin ::標記,默認沒有重復 set findedfalse :loop for /f "tokens1* delims;" %%a in ("%remain%") do (::如果找到相同的了if…

海量數據處理--位圖(BitMap)

對于海量數據這個詞&#xff0c;大家不難理解吧。主要是針對給定的數據量特別大&#xff0c;占用內存特別大的情況。那么和位圖有什么關系呢。看下面一個騰訊的海量數據的例子吧。 例&#xff1a;給40億個不重復的無符號整數&#xff0c;沒排過序。給一個無符號整數&#xff0…

ps命令與top命令參數意義詳解

文章目錄1.ps -l2.ps aux3.top面試經常被問道&#xff0c;特別是top。1.ps -l 參數解釋F代表這個程序旗標 (process flags)&#xff0c;說明這個程序的總結權限&#xff0c;常見號碼有&#xff1a;o 若為 4 表示此程序的權限為 root &#xff1b;o 若為 1 則表示此子程序僅進行…

python 打包成exe 程序的方法. 轉

轉自 https://blog.csdn.net/lzy98/article/details/83246281

哈希拓展--布隆過濾器

一、問題概述 布隆過濾器是由布隆提出來的&#xff0c;是由一個很長的二進制序列和一系列的映射函數組成。主要用于檢測一個元素是否在一個集合中。當然在設計計算機軟件時&#xff0c;我們也經常會判斷一個元素是否在一個集合中。比如&#xff1a;在字處理軟件中&#xff0c;…

開啟一個新的命令行窗口

1&#xff0c;start cmd /k echo Hello, World!2&#xff0c;start cmd /C pause區別是第二種執行完畢以后&#xff0c;新開的窗口會自動關閉&#xff0c;第一種則不會