數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì) 迷宮程序_第1頁
數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì) 迷宮程序_第2頁
數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì) 迷宮程序_第3頁
數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì) 迷宮程序_第4頁
數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì) 迷宮程序_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第第頁數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)迷宮程序C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

目次

一.課程設(shè)計(jì)目的二.功能說明三.具體設(shè)計(jì)

3.1.功能模塊設(shè)計(jì)3.1.1.主函數(shù)main()執(zhí)行流程圖3.1.2.創(chuàng)建模塊3.1.3.操作模塊3.1.4.顯示模塊3.1.5.其他模塊3.2.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計(jì)3.3.函數(shù)功能描述

四.程序?qū)崿F(xiàn)

4.1.源碼分析4.2.調(diào)試結(jié)果

4.3.遇到的問題及解決4.4.時(shí)間繁復(fù)度分析4.5.算法的改進(jìn)思想

五.結(jié)束語六.

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

一.課程設(shè)計(jì)目的

1.理解和掌控雙向鏈表的數(shù)據(jù)結(jié)構(gòu)。

2.了解迷宮問題的提出背景、機(jī)器窮舉法求解思路。3.運(yùn)用機(jī)器窮舉法和雙向鏈表結(jié)構(gòu)實(shí)現(xiàn)迷宮路徑的查找。4.設(shè)計(jì)實(shí)現(xiàn)一個(gè)完整的迷宮求解程序。

二.功能說明

整個(gè)試驗(yàn)將實(shí)現(xiàn)迷宮路徑的查找,并圖形化輸出其中最短的路徑。本試驗(yàn)?zāi)_步的存放運(yùn)用雙向鏈表實(shí)現(xiàn),迷宮運(yùn)用二維數(shù)組存放。機(jī)器通過窮舉法解出迷宮的最短路徑,儲(chǔ)存在雙向鏈表中,最末輸出。整個(gè)試驗(yàn)分為以下幾個(gè)模塊:

1.創(chuàng)建模塊。本試驗(yàn)的創(chuàng)建包含兩方面,迷宮的定義和腳步的初始化。迷宮的定義通過修改二維數(shù)組實(shí)現(xiàn),最終創(chuàng)建一個(gè)確定的迷宮。腳步的初始化由程序自行完成,最終建立一個(gè)雙向鏈表的附加頭結(jié)點(diǎn)。

2.路徑查找模塊。路徑查找核心分為兩個(gè)部分:路徑查找、更優(yōu)解替換。路徑查找包括可通性檢查、腳步前進(jìn)、腳步后退三個(gè)模塊??赏ㄐ詸z查會(huì)檢查當(dāng)前腳步的四個(gè)方向是否有通路。腳步前進(jìn)可以在有通路的狀況下抵達(dá)下一個(gè)點(diǎn),并記錄在腳步雙向鏈表中。腳步后退使在當(dāng)前腳步無路的狀況下后退一步,并轉(zhuǎn)向其他方向,同時(shí)刪除鏈表中最末一個(gè)腳步。當(dāng)求出的路徑比上一次求出的路徑更短時(shí),更優(yōu)解替換將更優(yōu)解替換進(jìn)路徑存儲(chǔ)鏈表。3.輸出模塊。實(shí)現(xiàn)迷宮解的圖形化顯示和路徑的坐標(biāo)輸出。

4.其他模塊。格式化模塊,用于迷宮求解后的處理。迷宮數(shù)組改寫模塊,根據(jù)求解的結(jié)果改寫迷宮二維數(shù)組,以滿意最終輸出需要。

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

圖1功能模塊圖

三.具體設(shè)計(jì)

3.1.功能模塊設(shè)計(jì)

3.1.1.主函數(shù)main()執(zhí)行流程圖

程序啟動(dòng)時(shí),執(zhí)行main()函數(shù)輸出菜單。用戶依據(jù)菜單的提示輸入要執(zhí)行的功能,程序會(huì)依據(jù)用戶的選擇執(zhí)行不同的功能。程序具體功能如下:

1.自動(dòng)演示:指令1,由程序自動(dòng)生成一個(gè)迷宮,并進(jìn)行路徑求解的演示。

2.手動(dòng)迷宮:指令2,由用戶自行創(chuàng)建一個(gè)迷宮,定義迷宮的大小、外形等,程序?qū)?duì)用戶指定的迷宮進(jìn)行求解。

3.程序援助:指令3,顯示程序援助和須要信息。4.退出:指令4,退出程序。執(zhí)行流程如下列圖:

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

圖2主函數(shù)main()執(zhí)行流程圖

3.1.2.創(chuàng)建模塊

本模塊將進(jìn)行待解迷宮的創(chuàng)建。

1.在自動(dòng)演示中,機(jī)器會(huì)調(diào)用autocreat()函數(shù)自動(dòng)創(chuàng)建一個(gè)10*10的迷宮。2.在手動(dòng)迷宮中,程序會(huì)運(yùn)用creat()函數(shù),用戶可以通過指定迷宮大小m*n,輸入迷宮每一行的數(shù)據(jù)來自行創(chuàng)建迷宮。

3.1.3.路徑查找模塊

1.路徑查找。

本模塊實(shí)現(xiàn)了路徑的查找和腳步的移動(dòng)。思路是依次判斷上右下左四個(gè)方向,假設(shè)

可以通過那么前進(jìn),不可通過那么轉(zhuǎn)向下一個(gè)方向,四個(gè)方向都不可通過那么后退。

1可通性檢查??赏ㄐ詸z查用來判斷指定的方向是否可以通過。需要判斷兩方面內(nèi)容,即下一點(diǎn)是否有障礙〔通過chk()函數(shù)完成〕和下一點(diǎn)是否已包含在了已有路徑之中。假設(shè)同時(shí)滿意無障礙和無包含條件,那么可以通過。否那么不能通過。2腳步前進(jìn)。下一點(diǎn)假設(shè)經(jīng)過檢查可以通過,那么通過move()函數(shù)完成前進(jìn)?!扒斑M(jìn)”的實(shí)現(xiàn)有兩方面,第一方面,將新腳步納入雙向鏈表中,另一方面,在迷宮數(shù)組中將本步坐標(biāo)所指標(biāo)記為“已走”。

3腳步后退。假設(shè)本步四個(gè)方向都不能行走,那么通過back()函數(shù)退后。退后包括兩方面,一方面把鏈表中最末一個(gè)節(jié)點(diǎn)拋棄,當(dāng)前腳步指向倒數(shù)第二個(gè)節(jié)點(diǎn)。另一

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

方面,將迷宮數(shù)組中已拋棄節(jié)點(diǎn)指向的元素重新標(biāo)記為“未走”,以便進(jìn)行其他路徑的尋路操作時(shí)可以順當(dāng)通過。2.更優(yōu)解替換。

本模塊完成了更優(yōu)解的替換。當(dāng)程序查找到比已存解更短的解時(shí),將會(huì)銷毀已存解,并將新解作為優(yōu)解。直到最末全部的路徑都搜尋完畢,優(yōu)解所存的路徑即為最短路徑。

3.1.3.輸出模塊

輸出模塊調(diào)用outlin()函數(shù),依據(jù)不同的參數(shù)值,輸出不同的內(nèi)容。主要功能是輸出迷宮的圖形化路徑,并輸出此路徑的坐標(biāo)順次表示。

3.1.4.其他模塊

1.格式化模塊。調(diào)用formatmaze()函數(shù),初始化存儲(chǔ)迷宮的二維數(shù)組、各變量值,銷

毀上次求解時(shí)產(chǎn)生的雙向鏈表,釋放內(nèi)存空間。

2.迷宮數(shù)組改寫模塊,調(diào)用revise()函數(shù),根據(jù)最終生成的最短雙向鏈表記錄的結(jié)果改寫迷宮二維數(shù)組,以滿意最終輸出需要。

3.2.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

存儲(chǔ)腳步的雙向鏈表定義如下:typedefstructlnode{

structlnode*ne*t;structlnode*pre;int*;inty;

intstepsum;//表示當(dāng)前腳步為第幾步。intdi;//用di代表已嘗試的腳步方向。

}node,*linklist;

3.3.函數(shù)功能描述

1.autocreat()

autocreat()用以自動(dòng)生成一個(gè)10*10的迷宮。2.creat()

通過用戶輸入的數(shù)據(jù),創(chuàng)建一個(gè)指定大小為m*n,具有特定外形的迷宮。

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

3.seek()

seek()程序?yàn)槊詫m查找的核心函數(shù),通過調(diào)用chk()、move()、back()以及自身的優(yōu)解替換功能,最終求解出一個(gè)迷宮的最短路徑,存儲(chǔ)在雙向鏈表之中。此外,seek()函數(shù)還具有判斷處理非常迷宮的功能。seek()函數(shù)不同返回值的含義,返回-1無解,1正常解出,2入口和出口重合。4.chk(intdirection)

chk()函數(shù)用來判斷指定方向的可通性,并返回。返回1表示可通,返回0表示不可通。5.move(intdirection)

move()函數(shù)可以實(shí)現(xiàn)腳步向指定方向移動(dòng)。即把新的腳步納入腳步雙向鏈表中,并將maze數(shù)組中相應(yīng)的元素記錄為-1表示已走。6.back()

當(dāng)腳步的四個(gè)方向均已不能通過時(shí),調(diào)用back()函數(shù)刪除雙向鏈表的最末一個(gè)腳步,并將maze數(shù)組中相應(yīng)元素標(biāo)記為1,實(shí)現(xiàn)腳步的回退。7.revise()

運(yùn)用指針p,依據(jù)已求的的腳步,改寫maze數(shù)組,使之滿意輸出需要。設(shè)有指針p,那么依據(jù)p-pre,p,p-ne*t三點(diǎn)所記錄的坐標(biāo),可以求出p的腳步外形,并標(biāo)記在maze[p-*][p-y]中。8.outlin()

輸出迷宮求解的結(jié)果。9.help()

help()函數(shù)用以輸出程序須要的援助信息。10.formatmaze()

初始化存儲(chǔ)迷宮的二維數(shù)組、各變量值,銷毀上次求解時(shí)產(chǎn)生的雙向鏈表,釋放內(nèi)存空間。

四.程序?qū)崿F(xiàn)

4.1.源碼分析

#includestdio.h#includestdlib.h#includemath.h#definema*size36#definestatusint

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

typedefstructlnode{

structlnode*ne*t;structlnode*pre;int*;inty;

intstepsum;//表示當(dāng)前腳步為第幾步。

intdi;//用di代表已嘗試的腳步方向。01234分別代表未嘗試、↑、→、↓、←。

}node,*linklist;

//全局變量開始

linklistL,L2,p,q,g;//三個(gè)指針pqg滿意不同函數(shù)臨時(shí)指針需要node*nowstep,*laststep;

intmaze[ma*size+2][ma*size+2];//存儲(chǔ)迷宮的數(shù)組,+2是為了加圍墻。intm,n;//迷宮行、列數(shù)變量

inte*it*,e*ity,entrance*,entrancey;//出入口。。*y分別代表行列.

intfinish=0;//走迷宮的最終全局結(jié)果。1有路,-1無路,2出入口重合。

inte*istL=0;//手動(dòng)創(chuàng)建迷宮,選擇r重新創(chuàng)建迷宮,formatmaze()將格式化各變量。檢測(cè)L鏈表是否存在防止程序崩潰。

intmindistance=0;//存放求出的最短路徑的步數(shù)。

//創(chuàng)建迷宮statuscreat(){

system(cls);inti,j;charcord='a';

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

do{

if(cord=='r')

formatmaze();

printf(\n請(qǐng)輸入迷宮行、列數(shù)(最大%d*%d)。\n行:,ma*size,ma*size);scanf(%d,m);printf(列:);scanf(%d,n);

while(mma*size||nma*size||m1||n1){

printf(輸入有誤。只支持%d*%d以內(nèi)的迷宮,請(qǐng)重新輸入行列數(shù)。\n

行:,ma*size,ma*size);

}

printf(\n輸入迷宮數(shù)據(jù),0為磚頭,1為通路,數(shù)字間用空格間隔。系統(tǒng)將自動(dòng)添

scanf(%d,m);printf(列:);scanf(%d,n);

加圍墻。\n);

printf(\n\n設(shè)定出入口數(shù)學(xué)坐標(biāo)(*,y)。\n已建立%d行%d列的迷宮,坐標(biāo)應(yīng)在(1,1)

for(i=1;i=m;i++){}

printf(\n已勝利建立迷宮,圖形如下:\n);outlin();

printf(第%d行的%d個(gè)數(shù)據(jù)(共%d行):,i,n,m);for(j=1;j=n;j++)

scanf(%d,maze[i][j]);

至(%d,%d)之間。\n,m,n,n,m);

printf(設(shè)定入口坐標(biāo),格式例如1,1:);

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

while(entrance*m||entranceyn||maze[entrance*][entrancey]==0){

printf(輸入有誤,請(qǐng)檢查。坐標(biāo)應(yīng)在(1,1)至(%d,%d)之間。\n請(qǐng)重新輸入入口

坐標(biāo),格式例如1,1:,n,m);

printf(輸入出口坐標(biāo),格式例如%d,%d:,n,m);scanf(%d,%d,e*ity,e*it*);

while(e*it*m||e*ityn||maze[e*it*][e*ity]==0){

printf(輸入有誤,請(qǐng)檢查。坐標(biāo)應(yīng)在(1,1)至(%d,%d)之間。\n請(qǐng)重新輸入出口

}

scanf(%d,%d,entrancey,entrance*);

坐標(biāo),格式例如%d,%d:,m,n,n,m);

}

system(cls);

printf(\n你設(shè)定的迷宮如下:\n);maze[entrance*][entrancey]=-1;maze[e*it*][e*ity]=-2;outlin();

maze[entrance*][entrancey]=1;maze[e*it*][e*ity]=1;

printf(入口和出口分別為(%d,%d)(%d,%d)。\n鍵入y將開始求解,鍵入r重新設(shè)定:

scanf(%d,%d,e*ity,e*it*);

,entrancey,entrance*,e*ity,e*it*);

scanf(%c%c,cord,cord);while(cord!='y'cord!='r'){}

printf(輸入有誤,請(qǐng)重新輸入:);scanf(%c%c,cord,cord);

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

}

}while(cord!='y');

//格式化迷宮。再創(chuàng)建新迷宮時(shí)用。。。formatmaze(){

if(e*istL==2){

while(L2-ne*t){}free(L2);

L2=L2-ne*t;free(L2-pre);

inti,j;

for(i=0;im+2;i++)

for(j=0;jn+2;j++)

maze[i][j]=0;

finish=0;

//以下語句把上次求解迷宮時(shí)建立的鏈表空間釋放。if(e*istL!=0){

while(L-ne*t){}free(L);

L=L-ne*t;free(L-pre);

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

}

}

e*istL=0;finish=0;mindistance=0;

//迷宮求解。。

statusseek(){

intallfinished=0;

if(entrance*==e*it*entrancey==e*ity)//入口和出口重合的非常狀況。

L=(linklist)malloc(sizeof(node));//建立存儲(chǔ)腳步的鏈表.L-ne*t=NULL;L-pre=NULL;L-stepsum=0;e*istL=1;

//初始化nowstep,令其在入口處。nowstep=(node*)malloc(sizeof(node));nowstep-*=entrance*;nowstep-y=entrancey;nowstep-pre=L;nowstep-ne*t=NULL;nowstep-di=0;nowstep-stepsum=1;

return2;

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

//開始查找第一條可通路徑。

while(nowstep-*!=e*it*||nowstep-y!=e*ity)//用1234代表↑→↓←四個(gè)方向。{

if(nowstep-di==0chk(1)==1)//可通需要滿意兩個(gè)條件,下一個(gè)點(diǎn)無障礙、下一

個(gè)點(diǎn)未涌現(xiàn)在已構(gòu)建的路徑中。

move(1);

elseif(nowstep-di==1chk(2)==1)

move(2);

elseif(nowstep-di==2chk(3)==1)

move(3);

elseif(nowstep-di==3chk(4)==1)

move(4);

elseif(nowstep-*==entrance*nowstep-y==entrancey)//假如腳步停留在了入口,

說明迷宮無解,不再查找。

//OK,查找出了第一條路徑L,說明迷宮有解。建立L2比較路徑,嘗試查找比L更短

return-1;

else}

mindistance=laststep-stepsum;

back();//本步無路了,回退。

的路徑。

if(laststep-stepsum==abs(entrance*-e*it*)+abs(entrancey-e*ity))//假設(shè)第一條路徑與理論

最小路徑相等,那么不需要再次比較,徑直返回。

{

L2=L;revise();return1;

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

e*istL=2;

while(allfinished==0){

L2=(linklist)malloc(sizeof(node));L2-ne*t=NULL;L2-pre=NULL;L2-stepsum=0;

//將最末一個(gè)最小路徑備份到L2,繼續(xù)求解。p=L2;g=L-ne*t;

while(g){}

q-ne*t=NULL;

q=(node*)malloc(sizeof(node));q-di=g-di;

q-stepsum=g-stepsum;q-*=g-*;q-y=g-y;q-pre=p;p-ne*t=q;g=g-ne*t;p=q;

//開始查找第二條可通路徑。

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

while(nowstep-*!=e*it*||nowstep-y!=e*ity){

if(nowstep-di==0chk(1)==1)

move(1);

elseif(nowstep-di==1chk(2)==1)

move(2);

elseif(nowstep-di==2chk(3)==1)

move(3);

elseif(nowstep-di==3chk(4)==1)

move(4);

else{

if(nowstep-stepsum==1nowstep-di==4)//第一步的四個(gè)方向也都嘗試

過了,說明迷宮全部可能路徑都已嘗試完畢。

}

{}back();

allfinished=1;break;

if(nowstep-stepsum=mindistance)//新路徑大于舊路徑,就不要再往下嘗試?yán)?/p>

費(fèi)時(shí)間了。換其他路徑。

if(allfinished==0)//每次找到更短路徑,都要存入L2,并銷毀原L2釋放空間。{

mindistance=laststep-stepsum;

}

back();

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

};

}

{}free(L2);

L2=L2-ne*t;free(L2-pre);

revise();//改寫maze數(shù)組里存儲(chǔ)的內(nèi)容,把每一步的方向信息寫進(jìn)去,以便輸出圖形路

徑。}

return1;

statuschk(intdirection)//判斷下一個(gè)方向是否有障礙的函數(shù)。{

nowstep-di++;if(direction==1){}

elseif(direction==2){}

if(maze[nowstep-*][(nowstep-y)+1]==1)

return1;

if(maze[(nowstep-*)-1][nowstep-y]==1)

return1;

else

return0;

else

return0;

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

}

{}

elseif(direction==4){}

if(maze[nowstep-*][(nowstep-y)-1]==1)

return1;

if(maze[(nowstep-*)+1][nowstep-y]==1)

return1;

else

return0;

else

return0;

statusmove(intdirection)//假如chk函數(shù)判斷下一點(diǎn)可通,那么運(yùn)用此函數(shù)實(shí)現(xiàn)走動(dòng)。{

switch(direction){

laststep=nowstep;//將laststep指向nowstep,再建立新的nowstep,實(shí)現(xiàn)nowstep的前進(jìn)。nowstep=(node*)malloc(sizeof(node));nowstep-di=0;nowstep-ne*t=NULL;nowstep-pre=laststep;

nowstep-stepsum=laststep-stepsum+1;nowstep-*=laststep-*;nowstep-y=laststep-y;laststep-ne*t=nowstep;

maze[laststep-*][laststep-y]=-1;//用-1將maze數(shù)組中的值標(biāo)記,表示已經(jīng)走過

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

case1:nowstep-*--;break;case2:nowstep-y++;break;case3:nowstep-*++;break;case4:nowstep-y--;}

}

statusback(){nowstep=laststep;free(nowstep-ne*t);

maze[nowstep-*][nowstep-y]=1;//將maze數(shù)組中標(biāo)記的-1改為1,以便其他路徑嘗試

時(shí)可以通過。laststep=laststep-pre;nowstep-ne*t=NULL;

}

revise()//│─┌┐└┘六個(gè)符號(hào)在maze數(shù)組里分別由234567表示.{intd*,dy;p=L2-ne*t-ne*t;while(p-ne*tp-pre){d*=(p-ne*t-*)-(p-pre-*);

dy=(p-ne*t-y)-(p-pre-y);if(dy==0)

maze[p-*][p-y]=2;

elseif(d*==0)

maze[p-*][p-y]=3;

elseif(d*==1dy==1)

{

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

}

}

}

maze[p-*][p-y]=5;

else

maze[p-*][p-y]=6;

elseif(d*==-1dy==1){}

elseif(d*==1dy==-1){}

elseif(d*==-1dy==-1){}p=p-ne*t;

if(p-*==p-pre-*)

maze[p-*][p-y]=6;if(p-*==p-pre-*)

maze[p-*][p-y]=4;if(p-*==p-pre-*)

maze[p-*][p-y]=7;

else

maze[p-*][p-y]=4;

else

maze[p-*][p-y]=7;

else

maze[p-*][p-y]=5;

maze[e*it*][e*ity]=-2;maze[entrance*][entrancey]=-1;

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

//輸出迷宮的函數(shù)statusoutlin(){

printf();//開始輸出圖形。for(j=0;jn+2;j++)

printf(%2d,j);inti,j;

if(finish==-1){}

elseif(finish==2){}

elseif(finish==1)

printf(\n\n已勝利查找出最短路徑,輸出如下:\n);printf(\n\n。。入口和出口重合了!\n);return1;

printf(\n\n沒找到路!你的迷宮有問題...\n);return1;

printf(\n);for(i=0;im+2;i++){

printf(%2d,i);for(j=0;jn+2;j++){

switch(maze[i][j]){

case-1:printf(入);break;

C語言、雙向鏈表實(shí)現(xiàn)的迷宮巡徑程序,包括課程設(shè)計(jì)和全部源代碼。模塊化附說明,方便改為其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。

}

}

}

}

case-2:printf(出);break;case0:printf(■);break;case1:printf();break;case2:printf(│);break;case3:printf(─);break;case4:printf(┌);break;case5:printf(┐);break;case6:printf(└);break;case7:printf(┘);break;

printf(\n);

if(finish==1)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論