用棧和遞歸求解迷宮問題

一、問題概述

小時候,我們都玩過走迷宮的游戲吧。看一下這個圖例:


遇到這種問題時,我們第一反應都會先找到迷宮的入口點,然后對上下左右四個方向進行尋跡,

?檢測當前位置是否是通路,是否可以通過,直至找到出口位置,才是迷宮的正確軌跡。如若走到死胡

?同里,則須返回重新選擇路徑走。

?我們來模擬一下迷宮問題,我們的迷宮是這樣的:


哈哈~雖然有點low!但是可以幫助我們解決實際問題,就將就著看吧,這個更能清晰的說明問題哦。

那么這個迷宮從何而來呢?我將它放在文件中,以讀取文件的方式,將其坐標保存在二維數組中嘍。


二、解決方案

(1)找到入口點(entry),這個由我們自己給定坐標即可。

(2)使用試探法對迷宮尋跡,有上下左右四個方向,將走過的路徑標記一下,將值賦值為其他

? ? ? ? ? ? ? ? ?值。(這里我將它賦為2)

(3)如果走進死胡同里,則采用回溯的思想,將其pop即可。

(4)判斷何時為迷宮出口,當它的橫坐標為(行數-1)時,說明已找到出口。(當然,在這里你

也可以不用規定出口就在最下方,視迷宮的圖例而定)

(5)若迷宮沒有出口,則棧為空。


三、實現代碼


//Maze.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("Maze.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 path)
{if((path._row >= 0 && path._row < 10) && (path._col >= 0 && path._col < 10) && (maze[path._row*n+path._col] == 0)){return true;}return false;
}//棧求解迷宮路徑
void GetMazePath(int *maze,size_t n,Pos entry,stack<Pos>& s)
{Pos cur = entry;Pos next = cur;maze[cur._row*n+cur._col] = 2;s.push(entry);while(!s.empty()){if(s.top()._row  == n-1){return;}//探測上下左右//上next = s.top();next._row-=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//右next = s.top();next._col+=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//下next = s.top();next._row+=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//左next = s.top();next._col-=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//沒有通路Pos tmp = s.top();maze[tmp._row*n+tmp._col] = 3;s.pop();}
}//遞歸求解迷宮路徑
void GetMazePath(int *maze,size_t n,Pos entry,stack<Pos>& s)
{Pos next = entry;maze[next._row*n+next._col] = 2;s.push(entry);if(next._row == n-1){return;}//探測上下左右//上next = entry;next._row-=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}//右next = entry;next._col+=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}//下next = entry;next._row+=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}//左next = entry;next._col-=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}
}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;}
}

//Maze.cpp

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

用棧和遞歸實現普通的迷宮問題還是可以的,但是還有一種這樣的迷宮:


當有多條路徑的時候,就會涉及到路徑長短的問題,到底走哪條路徑會是最優。下篇博客給大家介紹哦。吐舌頭吐舌頭

希望看過此篇博客的編程愛好者提出見解哈。


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

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

相關文章

exit(0) return區別

1. return是返回函數調用&#xff0c;如果返回的是main函數&#xff0c;則為退出程序。 exit是在調用處強行退出程序&#xff0c;運行一次程序就結束&#xff0c; 無論寫在那里&#xff0c;都是程序推出&#xff0c;括號里的數字0,1,-1會被寫入環境變量ERRORLEVEL&#xff0c…

electron 5.0.3版本 改動的地方

BrowserWindow.getFocusedWindow 1. BrowserWindow.getFocusedWindow getFocusedWindow 已經不是一個方法了&#xff0c; 這個簡單的問題解決了半天&#xff0c;因為我看文檔上 還是當一個方法來調用&#xff0c; 文檔沒有正確更新&#xff0c;實際上已經變成了一個屬性&#…

【c語言】棋盤游戲--三子棋

一、問題概述 大家都玩過棋盤游戲吧&#xff0c;像五子棋一樣&#xff0c;玩家或者是電腦一人下一次&#xff0c;當玩家或者是電腦的某一方先將各自的五個棋子下成一條線時&#xff0c;誰就贏&#xff0c;棋盤游戲就會結束。 當然&#xff0c;我今天要介紹的是三子棋&#xff…

【轉】淺析task_struct結構體

https://blog.csdn.net/peiyao456/article/details/54407343

electron 主進程與渲染進程 渲染進程與渲染進程 之間的通信

主進程與渲染進程之間的通信 這是渲染進程 // 渲染進程執行主進程里面的方法&#xff0c;主進程給渲染進程反饋處理結果 。 var sendreplayDomdocument.querySelector(#sendreplay); sendreplayDom.onclickfunction(){// alert(1213)//渲染進程給主進程廣播數據ipcRenderer.se…

centos升級之gcc 升級 gcc-7.3.0安裝

更新于&#xff1a;2018_7_28 安裝時間非常非常久&#xff0c;我最快一次40分鐘&#xff0c;最長一次兩個小時 cd / wget ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz tar -zxvf gcc-7.3.0.tar.gz cd gcc-7.3.0 ./contrib/download_prerequisites mkdir build cd …

[數據結構]用插入排序和選擇排序的思想實現優先級隊列

一、問題概述 優先級隊列的定義&#xff1a; 優先級隊列不同于普通的隊列&#xff0c;普通的隊列具有先進先出的原則&#xff0c;而優先級隊列是選擇優先級最高的先出隊。那么&#xff0c;如何模擬實現優先級隊列呢&#xff1f;在這里&#xff0c;我們將較大的值作為優先級較高…

node.js https 模塊設置請求頭等信息

// https://www.iqiyi.com/v_19rs789v28.html var fs require(fs); var https require(https); var option{rejectUnauthorized: false,hostname:www.iqiyi.com,path:/,headers:{Accept:*/*,Accept-Encoding:utf-8, //這里設置返回的編碼方式 設置其他的會是亂碼Accept-Lang…

centos升級之vim vim8.0安裝

YCM安裝攻略&#xff1a;https://blog.csdn.net/csdn_kou/article/details/81213935 卸載舊的vim yum remove vim* -y 一、源碼編譯安裝vim8.0 配置epel源 yum install epel-release 安裝python3,以及vim8.0編譯環境 yum install -y gcc python34 python34-devel ncurses…

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

一、問題概述 之前&#xff0c;我們了解了如何實現迷宮問題&#xff08;對于迷宮只有一個出口可以通的情況&#xff09;&#xff0c;事實上我們的迷宮有多個出口&#xff0c;對于每條路徑來說&#xff0c;有長有短&#xff0c;所以在這里&#xff0c;我們討論一下迷宮的最短路…

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;即父節點最多只有兩個孩…