資料結構之迷宮問題

2021-06-26 07:44:47 字數 1285 閱讀 7373

求迷宮問題就是求出從入口到出口的路徑。在求解時,通常用的是「窮舉求解」的方法,即從入口出發,順某一方向向前試探,若能走通,則繼續往前走;否則沿原路退回,換乙個方向再繼續

試探,直至所有可能的通路都試探完為止。為了保證在任何位置上都能沿原路退回(稱為回溯),需要用乙個後進先出的棧來儲存從入口到當前位置的路徑。

首先用如圖3.3所示的方塊圖表示迷宮。對於圖中的每個方塊,用空白表示通道,用陰影表示牆。所求路徑必須是簡單路徑,即在求得的路徑上不能重複出現同一通道塊。 

對於迷宮中的每個方塊,有上下左右四個方塊相鄰,如圖3.4所示,第i行第j列的當前方塊的位置為(i,j),規定上方方塊為

方位0,順時針方向遞增編號。在試探過程中,假設從方位0到方位3的方向查詢下乙個可走的方塊。

為了便於回溯,對於可走的方塊都要進棧,並試探它的下一可走的方位,將這個可走的方位儲存到棧中。

求解迷宮(1,1)到(m-2,n-2)路徑的過程是:先將入口進棧(初始方位設定為-1),在棧不空時迴圈:取棧頂方塊(不退棧),若該方塊是出口,則輸出棧中方塊即為路徑。否則,找下乙個可走的相鄰方塊,若不存在這樣的方塊,則退棧。若存在這樣的方塊,則將其方位儲存到棧頂元素中,並將這個可走的相鄰方塊進棧(初始方位設定為-1)。

為了保證試探的可走相鄰方塊不是已走路徑上的方塊,如(i,j)已進棧,在試探(i+1,j)的下一可走方塊時,又試探到(i,j),這樣可能會引起死迴圈,為此,在乙個方塊進棧後,將對應的mg陣列元素值改為-1(變為不可走的相鄰方塊),當退棧時(表示沒有可走相鄰方塊),將其恢復為0。

#include "stdafx.h"

#include #define m 4 //行數

#define n 4 //列數

#define maxsize 100 //棧最多元素個數

int mg[m+2][n+2]=,,,

,,};struct

stack[maxsize],path[maxsize]; //定義棧和存放最短路徑的陣列

int top=-1; //棧頂指標

int count=1; //路徑數計數

int minlen=maxsize; //最短路徑長度

//求迷宮路徑

void mgpath(int xi,int yi,int xe,int ye)

printf("\n");

if (top+1

資料結構之迷宮問題

迷宮結構如下 定義三個結構體,define size 100 對該迷宮,100個夠用了 define add size 10 每次要增加的大小 define endflag null 出錯時返回的標誌 define row 8 迷宮的行的大小,對應i define col 8 迷宮的列的大小,對應j...

資料結構 之迷宮問題

所謂迷宮,就是在乙個矩陣中,從開始位置有一條通路可以走到最末尾的位置 先畫乙個迷宮,格式為txt,和編譯的資料夾放在一起 在迷宮中,0表示可以走通的路,而1則表示不可走通的牆 首先定義乙個結構體,用來存放行和列 struct pos 接下來從檔案中獲得迷宮 的矩陣 void getmaze int ...

資料結構 迷宮問題

迷宮問題的總體思路是,從迷宮的入口出發,沿著某乙個方向向前試探,若能夠行得通,則繼續往前走,否則原來返回,再換另乙個方向繼續試探,直到所有可能的通路都被試探過,為了保證在任何乙個位置都能夠原來返回,需要設定乙個堆疊結構來儲存從入口到當前位置的路徑。maze.h pragma once include...