日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第11周【项目5 - 迷宫问题之图深度优先遍历解法】

發(fā)布時(shí)間:2024/1/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第11周【项目5 - 迷宫问题之图深度优先遍历解法】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

/**Copyright(c)2017,煙臺(tái)大學(xué)計(jì)算機(jī)學(xué)院*All right reserved.*文件名稱:20171207.cpp*作者:李小同*完成日期;2017年12月07日*版本號(hào);v1.1**問(wèn)題描述:如下*輸入描述:功能需求*程序輸出:所需功能的實(shí)現(xiàn) */

設(shè)計(jì)一個(gè)程序,采用深度優(yōu)先遍歷算法的思路,解決迷宮問(wèn)題。?
  (1)建立迷宮對(duì)應(yīng)的圖數(shù)據(jù)結(jié)構(gòu),并建立其鄰接表表示。?
  (2)采用深度優(yōu)先遍歷的思路設(shè)計(jì)算法,輸出從入口(1,1)點(diǎn)到出口(M,N)的所有迷宮路徑。?


#include <stdio.h> #include <malloc.h> #define MaxSize 100 #define M 4 #define N 4 //以下定義鄰接表類型 typedef struct ANode //邊的結(jié)點(diǎn)結(jié)構(gòu)類型 {int i,j; //該邊的終點(diǎn)位置(i,j)struct ANode *nextarc; //指向下一條邊的指針 } ArcNode;typedef struct Vnode //鄰接表頭結(jié)點(diǎn)的類型 {ArcNode *firstarc; //指向第一條邊 } VNode;typedef struct {VNode adjlist[M+2][N+2]; //鄰接表頭節(jié)點(diǎn)數(shù)組 } ALGraph; //圖的鄰接表類型typedef struct {int i; //當(dāng)前方塊的行號(hào)int j; //當(dāng)前方塊的列號(hào) } Box;typedef struct {Box data[MaxSize];int length; //路徑長(zhǎng)度 } PathType; //定義路徑類型int visited[M+2][N+2]= {0}; int count=0; void CreateList(ALGraph *&G,int mg[][N+2]) //建立迷宮數(shù)組對(duì)應(yīng)的鄰接表G {int i,j,i1,j1,di;ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0; i<M+2; i++) //給鄰接表中所有頭節(jié)點(diǎn)的指針域置初值for (j=0; j<N+2; j++)G->adjlist[i][j].firstarc=NULL;for (i=1; i<=M; i++) //檢查mg中每個(gè)元素for (j=1; j<=N; j++)if (mg[i][j]==0){di=0;while (di<4){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) //(i1,j1)為可走方塊{p=(ArcNode *)malloc(sizeof(ArcNode)); //創(chuàng)建一個(gè)節(jié)點(diǎn)*pp->i=i1;p->j=j1;p->nextarc=G->adjlist[i][j].firstarc; //將*p節(jié)點(diǎn)鏈到鏈表后G->adjlist[i][j].firstarc=p;}di++;}} } //輸出鄰接表G void DispAdj(ALGraph *G) {int i,j;ArcNode *p;for (i=0; i<M+2; i++)for (j=0; j<N+2; j++){printf(" [%d,%d]: ",i,j);p=G->adjlist[i][j].firstarc;while (p!=NULL){printf("(%d,%d) ",p->i,p->j);p=p->nextarc;}printf("\n");} } void FindPath(ALGraph *G,int xi,int yi,int xe,int ye,PathType path) {ArcNode *p;visited[xi][yi]=1; //置已訪問(wèn)標(biāo)記path.data[path.length].i=xi;path.data[path.length].j=yi;path.length++;if (xi==xe && yi==ye){printf(" 迷宮路徑%d: ",++count);for (int k=0; k<path.length; k++)printf("(%d,%d) ",path.data[k].i,path.data[k].j);printf("\n");}p=G->adjlist[xi][yi].firstarc; //p指向頂點(diǎn)v的第一條邊頂點(diǎn)while (p!=NULL){if (visited[p->i][p->j]==0) //若(p->i,p->j)方塊未訪問(wèn),遞歸訪問(wèn)它FindPath(G,p->i,p->j,xe,ye,path);p=p->nextarc; //p指向頂點(diǎn)v的下一條邊頂點(diǎn)}visited[xi][yi]=0; }int main() {ALGraph *G;int mg[M+2][N+2]= //迷宮數(shù)組{{1,1,1,1,1,1},{1,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,1},{1,1,1,1,1,1}};CreateList(G,mg);printf("迷宮對(duì)應(yīng)的鄰接表:\n");DispAdj(G); //輸出鄰接表PathType path;path.length=0;printf("所有的迷宮路徑:\n");FindPath(G,1,1,M,N,path);return 0; }

運(yùn)行結(jié)果:




總結(jié)

以上是生活随笔為你收集整理的第11周【项目5 - 迷宫问题之图深度优先遍历解法】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。