国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

棧的應(yīng)用之迷宮求解(C語言附完整代碼)

這篇具有很好參考價(jià)值的文章主要介紹了棧的應(yīng)用之迷宮求解(C語言附完整代碼)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


一,問題描述

給定一個(gè)MXN的迷宮圖,求一條從指定入口到出口的迷宮路徑。假設(shè)一個(gè)迷宮圖如圖所示(這里M=8,N=8),其中的每個(gè)方塊用空白表示通道,用藍(lán)色陰影表示障礙物。一般情況下,所求迷宮路徑是簡(jiǎn)單路徑,即在求得的迷宮路徑上不會(huì)重復(fù)出現(xiàn)同一方塊。一個(gè)迷官圖的迷宮路徑可能有多條,這些迷宮路徑有長有短,這里僅僅考慮用棧求一條從指定入口到出口的迷宮路徑。(因此利用棧進(jìn)行迷宮求解得到的不一定是最優(yōu)解
棧的應(yīng)用之迷宮求解(C語言附完整代碼)

二,數(shù)據(jù)組織

為了表示迷宮,設(shè)置一個(gè)數(shù)組mg,其中每個(gè)元素表示一個(gè)方塊的狀態(tài),為0時(shí)表示對(duì)應(yīng)方塊是通道,為1時(shí)表示對(duì)應(yīng)方塊是障礙物。為了算法方便,一般在迷宮的外圍加一條圍墻。

int mg[M+2][N+2]=  //由于迷宮四周加上了一條圍墻,所以mg數(shù)組的行數(shù)和列數(shù)均加2
{	
	{1,1,1,1,1,1,1,1,1,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,0,0,1,1,0,0,1},
	{1,0,1,1,1,0,0,0,0,1},
	{1,0,0,0,1,0,0,0,0,1},
	{1,0,1,0,0,0,1,0,0,1},
	{1,0,1,1,1,0,1,1,0,1},
	{1,1,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}
};

定義一種新的數(shù)據(jù)類型Box,來表示當(dāng)前方塊的行號(hào),列號(hào)和下一步可走相鄰方塊的方位號(hào)

typedef struct
{
	int i;				//當(dāng)前方塊的行號(hào)
	int j;				//當(dāng)前方塊的列號(hào)
	int di;				//di是下一可走相鄰方位的方位號(hào)
} Box;

在該算法中使用順序棧進(jìn)行存儲(chǔ),聲明迷宮棧如下:

typedef struct
{
	Box data[MaxSize];	//存放方塊
    int top;			//棧頂指針
} StType;				//定義棧類型

三,設(shè)計(jì)算法

對(duì)于迷宮中的每個(gè)方塊,有上,下,左,右四個(gè)方向的相鄰方塊,將第i行j列的方塊的位置記為( i , j ),規(guī)定該方塊上方的方塊為方位0,并按順時(shí)針方向遞增為其他方位編號(hào),在試探過程中,從方位0到方位3的方向查找下一個(gè)可走的相鄰方塊。
棧的應(yīng)用之迷宮求解(C語言附完整代碼)
迷宮求解在求解時(shí)使用“窮舉法”,即從入口出發(fā),按方位從0到3試探相鄰的方塊,如果找到一個(gè)相鄰可走方塊,就繼續(xù)走下去并記下所走的方位。如果某個(gè)方塊沒有可走的相鄰方塊,則返回到前一個(gè)方塊,換下一個(gè)方位繼續(xù)試探,直到所有可能的通路都試探完為止。

為了保證在任何位置上都能沿原路退回(稱為回溯),需要保存從入口到當(dāng)前位置的路徑上走過的方塊,由于回溯的過程是從當(dāng)前位置退回到前一個(gè)方塊,體現(xiàn)出后進(jìn)先出的特點(diǎn),所以采用棧來保存走過的方塊。

若一個(gè)非出口方塊 ( i , j )是可走的,將它進(jìn)棧,每個(gè)剛剛進(jìn)棧的方塊:其方位di置為-1(表示尚未試探它的周圍),然后開始從方位0到方位3試探這個(gè)棧頂方塊的四周,如果找到某個(gè)方位d的相鄰方塊(i1,j1)是可走的,則將棧頂方塊(i,j)的方位di置為d,同時(shí)將方塊(i1,j1)進(jìn)棧,再繼續(xù)從方塊(i1,j1)做相同的操作。若方塊(i1 , j1 )的四周沒有一個(gè)方位是可走的,將它退棧。

算法中應(yīng)保證試探的相鄰可走方塊不是已走路徑上的方塊。如方塊( i , j )已進(jìn)棧,在試探方塊( i+1,j )的相鄰可走方塊時(shí)又會(huì)試探到方塊( i , j )。也就是說,從方塊( i , j )出發(fā)會(huì)試探方塊 ( i+1 , j ) ,而從方塊( i+1, j ) 出發(fā)又會(huì)試探方塊( i , j ),這樣可能會(huì)引起死循環(huán),為此在一個(gè)方塊進(jìn)棧后將相應(yīng)的mg數(shù)組元素值改為-1(變?yōu)椴豢勺叩南噜彿綁K),當(dāng)退棧時(shí)(表示該棧頂方塊沒有可走相鄰方塊),將其恢復(fù)為0。

試探過程動(dòng)畫演示:
棧的應(yīng)用之迷宮求解(C語言附完整代碼)

四,完整代碼

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define M 8
#define N 8
int mg[M+2][N+2]=
{	
	{1,1,1,1,1,1,1,1,1,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,0,0,1,1,0,0,1},
	{1,0,1,1,1,0,0,0,0,1},
	{1,0,0,0,1,0,0,0,0,1},
	{1,0,1,0,0,0,1,0,0,1},
	{1,0,1,1,1,0,1,1,0,1},
	{1,1,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}
};
//迷宮棧基本運(yùn)算
typedef struct
{
	int i;				//當(dāng)前方塊的行號(hào)
	int j;				//當(dāng)前方塊的列號(hào)
	int di;				//di是下一可走相鄰方位的方位號(hào)
} Box;
typedef struct
{
	Box data[MaxSize];	//存放方塊
    int top;			//棧頂指針
} StType;				//定義棧類型

void InitStack(StType *&s)		//初始化棧
{	s=(StType *)malloc(sizeof(StType));
	s->top=-1;
}
void DestroyStack(StType *&s)	//銷毀棧
{
	free(s);
}
bool StackEmpty(StType *s)		//判斷棧是否為空
{
	return(s->top==-1);
}
bool Push(StType *&s,Box e)	//進(jìn)棧元素e
{
	if (s->top==MaxSize-1)
		return false;
	s->top++;
	s->data[s->top]=e;
	return true;
}
bool Pop(StType *&s,Box &e)	//出棧元素e
{
	if (s->top==-1)	
		return false;
	e=s->data[s->top];
	s->top--;
	return true;
}
bool GetTop(StType *s,Box &e)	//取棧頂元素e
{
	if (s->top==-1)	
		return false;
	e=s->data[s->top];
	return true;
}
//---------------------------------------------------------
bool mgpath(int xi,int yi,int xe,int ye)	//求解路徑為:(xi,yi)->(xe,ye)
{
	Box path[MaxSize], e;
	int i,j,di,i1,j1,k;
	bool find;
	StType *st;								//定義棧st
	InitStack(st);							//初始化棧頂指針
	e.i=xi; e.j=yi;	e.di=-1;				//設(shè)置e為入口
	Push(st,e);								//方塊e進(jìn)棧
	mg[xi][yi]=-1;							//入口的迷宮值置為-1避免重復(fù)走到該方塊
	while (!StackEmpty(st))					//棧不空時(shí)循環(huán)
	{
		GetTop(st,e);						//取棧頂方塊e
		i=e.i; j=e.j; di=e.di;
		if (i==xe && j==ye)					//找到了出口,輸出該路徑
		{ 
			printf("一條迷宮路徑如下:\n");
			k=0;
			while (!StackEmpty(st))
			{
				Pop(st,e);					//出棧方塊e
				path[k++]=e;				//將e添加到path數(shù)組中
			}
			while (k>=1)
			{
				k--;
				printf("\t(%d,%d)",path[k].i,path[k].j);
				if ((k+2)%5==0)				//每輸出每5個(gè)方塊后換一行
					printf("\n");  
			}
			printf("\n");
			DestroyStack(st);				//銷毀棧
			return true;					//輸出一條迷宮路徑后返回true
		}
		find=false;
		while (di<4 && !find)				//找相鄰可走方塊(i1,j1)
		{	
			di++;
			switch(di)
			{
			case 0:i1=i-1; j1=j;   break;
			case 1:i1=i;   j1=j+1; break;
			case 2:i1=i+1; j1=j;   break;
			case 3:i1=i;   j1=j-1; break;
			}
			if (mg[i1][j1]==0) find=true;	//找到一個(gè)相鄰可走方塊,設(shè)置find我真
		}
		if (find)							//找到了一個(gè)相鄰可走方塊(i1,j1)
		{	

			st->data[st->top].di=di;		//修改原棧頂元素的di值
			e.i=i1; e.j=j1; e.di=-1;
			Push(st,e);						//相鄰可走方塊e進(jìn)棧
			mg[i1][j1]=-1;					//(i1,j1)的迷宮值置為-1避免重復(fù)走到該方塊
		}
		else								//沒有路徑可走,則退棧
		{	
			Pop(st,e);						//將棧頂方塊退棧
			mg[e.i][e.j]=0;					//讓退棧方塊的位置變?yōu)槠渌窂娇勺叻綁K
		}
	}
	DestroyStack(st);						//銷毀棧
	return false;							//表示沒有可走路徑,返回false
}
int main()
{
	mgpath(1,1,M,N);
	return 0;
}

參考資料:李春葆《數(shù)據(jù)結(jié)構(gòu)教程》(第五版)文章來源地址http://www.zghlxwxcb.cn/news/detail-464199.html

到了這里,關(guān)于棧的應(yīng)用之迷宮求解(C語言附完整代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • DFS求解迷宮問題

    DFS求解迷宮問題

    ? ?下面來具體分析一下算法的具體實(shí)現(xiàn) 首先要進(jìn)行搜索,對(duì)搜索方向的順序規(guī)定為:右--下--左--上 ? 按照搜索順序從起點(diǎn)開始搜索,在搜索的過程中將已經(jīng)搜索過的位置設(shè)為已訪問,這樣我們就可以得到如下圖所示的一條路線。 在到達(dá)終點(diǎn)后要進(jìn)行回溯,利用 回溯 找到其

    2024年02月11日
    瀏覽(18)
  • A*算法求解迷宮尋路問題實(shí)驗(yàn)

    A*算法求解迷宮尋路問題實(shí)驗(yàn)

    一、實(shí)驗(yàn)?zāi)繕?biāo): 熟悉和掌握A*算法實(shí)現(xiàn)迷宮尋路功能,要求掌握啟發(fā)式函數(shù)的編寫以及各類啟發(fā)式函數(shù)效果的比較。 二、實(shí)驗(yàn)內(nèi)容與完成情況: 尋路問題常見于各類游戲中角色尋路、三維虛擬場(chǎng)景中運(yùn)動(dòng)目標(biāo)的路徑規(guī)劃、機(jī)器人尋路等多個(gè)應(yīng)用領(lǐng)域。迷宮尋路問題是在以方

    2024年02月04日
    瀏覽(19)
  • A*算法求解迷宮問題(算法講解與證明、python實(shí)現(xiàn)與可視化)

    A*算法求解迷宮問題(算法講解與證明、python實(shí)現(xiàn)與可視化)

    目錄 一、引入 二、具體細(xì)節(jié) 1、BFS(Breadth First Search) 2、Dijkstra(Uniform Cost Search) 3、啟發(fā)式(Heuristic search) 4、A*算法 4.1 算法細(xì)節(jié) 4.2 A與A*算法 4.3 A*算法證明 4.4 算法過程 三、具體實(shí)現(xiàn) 1、實(shí)驗(yàn)要求 2、代碼實(shí)現(xiàn) 四、源代碼 ? ? ? ?當(dāng)我開始學(xué)習(xí)該算法時(shí),網(wǎng)上已經(jīng)有了很

    2023年04月08日
    瀏覽(22)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑩ - 棧的概念與實(shí)現(xiàn)(附完整源碼)

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑩ - 棧的概念與實(shí)現(xiàn)(附完整源碼)

    ? ? 棧存儲(chǔ)數(shù)據(jù)的方式跟數(shù)組一樣,都是將元素排成一行。只不過它還有以下 3 條約束。 ? ● 只能在末尾插入數(shù)據(jù)。 ? ● 只能讀取末尾的數(shù)據(jù)。 ? ● 只能移除末尾的數(shù)據(jù)。 你可以將??闯梢化B碟子:你只能看到最頂端那只碟子的碟面,其他都看不到。另外,要加碟子只能

    2024年02月16日
    瀏覽(22)
  • 多目標(biāo)應(yīng)用:MOGWO求解環(huán)境經(jīng)濟(jì)負(fù)荷分配問題(IEEE-30bus)提供MATLAB代碼

    多目標(biāo)應(yīng)用:MOGWO求解環(huán)境經(jīng)濟(jì)負(fù)荷分配問題(IEEE-30bus)提供MATLAB代碼

    MOGWO原理參考文獻(xiàn): S. Mirjalili, S. Saremi, S. M. Mirjalili, L. Coelho, Multi-objective grey wolf optimizer: A novel algorithm for multi-criterion optimization, Expert Systems with Applications, in press, DOI: http://dx.doi.org/10.1016/j.eswa.2015.10.039 文獻(xiàn):吳亮紅. 多目標(biāo)動(dòng)態(tài)差分進(jìn)化算法及其應(yīng)用研究[D].湖南大學(xué),2011. 隨著

    2024年02月04日
    瀏覽(21)
  • 【路徑規(guī)劃】(2) A* 算法求解最短路,附python完整代碼

    【路徑規(guī)劃】(2) A* 算法求解最短路,附python完整代碼

    大家好,今天和各位分享一下機(jī)器人路徑規(guī)劃中非常經(jīng)典的 A* 算法,感興趣的點(diǎn)個(gè)關(guān)注,文末有 python 代碼,那我么開始吧。 A* 算法是 1968 年 P.E.Hart[1]等人所提出的 在全局地圖環(huán)境中所有已知情形下求解最短路徑問題的方法,由于其簡(jiǎn)潔高效,容易實(shí)施 等 優(yōu)點(diǎn) 而受到人們

    2024年02月03日
    瀏覽(19)
  • 【路徑規(guī)劃】(1) Dijkstra 算法求解最短路,附python完整代碼

    【路徑規(guī)劃】(1) Dijkstra 算法求解最短路,附python完整代碼

    好久不見,我又回來了, 這段時(shí)間把路徑規(guī)劃的一系列算法整理一下 ,感興趣的點(diǎn)個(gè)關(guān)注。今天介紹一下機(jī)器人路徑規(guī)劃算法中最基礎(chǔ)的 Dijkstra 算法,文末有 python 完整代碼,那我們開始吧。 1959 年,荷蘭計(jì)算機(jī)科學(xué)家 ·EdsgerWybe·Dijkstra 發(fā)表了論文《 A note on two problems in c

    2023年04月08日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)--迷宮求解

    數(shù)據(jù)結(jié)構(gòu)--迷宮求解

    文章目錄 一、問題的描述 二、系統(tǒng)功能設(shè)計(jì) 三、各個(gè)代碼部分 四、整體代碼及其運(yùn)行 五、總結(jié) 迷宮求解--C語言 在一個(gè)迷宮中,需要我們找到出去的道路,并且得到的路經(jīng)是最短的。 迷宮設(shè)置如下:迷宮使用標(biāo)記(0,1,2,3分別代表迷宮的墻壁,通道,入口和出口) 從開

    2024年02月15日
    瀏覽(14)
  • 【算法】(BFS/DFS)迷宮路徑問題(C語言)

    【算法】(BFS/DFS)迷宮路徑問題(C語言)

    題目 :現(xiàn)有一迷宮如下圖所示,藍(lán)色部分為墻壁,白色部分為通路,入口在左上角(1,1)處,出口在右下角(8,8)處,試找出一條路徑以通過該迷宮(路徑不能重疊)。 分析 : ① 使用二維數(shù)組來存儲(chǔ)迷宮,墻用 1 表示,路用 0 表示,如下圖所示: 為與題目中的入口坐標(biāo)

    2024年02月07日
    瀏覽(23)
  • python黑客代碼雨:實(shí)現(xiàn)包括中文等的多種語言,全屏幕顯示,從根本解決中文不顯示問題,有完整可執(zhí)行代碼

    python黑客代碼雨:實(shí)現(xiàn)包括中文等的多種語言,全屏幕顯示,從根本解決中文不顯示問題,有完整可執(zhí)行代碼

    完整代碼放在最下面 上結(jié)果圖: 中文無法顯示的亞子:(也挺好看的哈哈) 正題: 代碼能跑但是中文是這種亂碼或者黑屏的情況主要是因?yàn)闆]有指定字體或者字體是你電腦沒有的 如何找到自己電腦的字體呢,代碼如下: 將獲取的字體復(fù)制到一個(gè)word文檔或者其他方式都可以

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包