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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求解迷宫问题的所有路径及最短路径程序

發布時間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求解迷宫问题的所有路径及最短路径程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?路障

?路障

?路障

?路障

?路障

?路障

?路障

?入口

?

?

?路障

?路障

?路障

?

?路障

?

?

?路障

?路障

?

?

?

?路障

?路障

?路障

?路障

?

?

出口?

?路障

?路障

?路障

?路障

?路障

?路障

?路障

如上圖,,要求輸出迷宮的所有路徑,并求出最短路徑長度及最短路徑。。。。。。

入口坐標設為(1,1),出口坐標設為(4,4),,,親,,,接下來你懂的。。。。。

?

?

?

?

#include<stdio.h>

#define M 4????//行數
#define N 4?????//列數
#define MaxSize????100?????//棧最多元素個數
int mg[M+2][N+2]={??????//一個迷宮,其四周要加上均為1的外框
????{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}
};

struct migong{
????int i;??????//路徑橫坐標
????int j;??????//路徑縱坐標
????int di;?????//方向
}Stack[MaxSize],Path[MaxSize];??????//定義棧和存放最短路徑的數組

int top=-1;?????//棧頂指針
int count=1;????//路徑數計數
int minlen=MaxSize;?????//最短路徑長度

void mgpath(){??????//路徑為:(1,1)->(M,N)
????int i,j,di,find,k;
????top++;Stack[top].i=1;Stack[top].j=1;Stack[top].di=-1;
????mg[1][1]=-1;????????//初始結點進棧
????while(top>-1){??????//棧不空時循環
????????i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
????????if(i==M && j==N){???????//找到了出口,輸出路徑
????????????printf("M:??",count++);
????????????for(k=0;k<=top;k++){
????????????????printf("(%d,%d)??",Stack[k],i,Stack[k].j);
????????????????if((k+1)%5==0)??????//輸出時每5個結點換一行
????????????????????printf("\n\t");
????????????}
????????????printf("\n");
????????????if(top+1<minlen){???????//比較輸出最短路徑
????????????????for(k=0;k<=top;k++)
????????????????????Path[k]=Stack[k];
????????????????minlen=top+1;
????????????}
????????????mg[Stack[top].i][Stack[top].j]=0;???//讓該位置變為其他路徑的可走結點
????????????top--;
????????????i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
????????}
????????find=0;
????????while(di<4 && find==0){?????//找下一個可走結點
????????????di++;
????????????switch(di){
????????????????case 0:i=Stack[top].i-1;j=Stack[top].j;break;???//上面
????????????????case 1:i=Stack[top].i;j=Stack[top].j+1;break;???//右邊
????????????????case 2:i=Stack[top].i+1;j=Stack[top].j;break;???//下面
????????????????case 3:i=Stack[top].i;j=Stack[top].j-1;break;???//左邊
????????????}
????????????if(mg[i][j]==0)
????????????????find=1;
????????}

????????if(find == 1){??????//找到了下一個可走結點
????????????Stack[top].di=di;???//修改原棧頂元素的di值
????????????top++;??????//下一個可走結點進棧
????????????Stack[top].i=i;
????????????Stack[top].j=j;
????????????Stack[top].di=-1;
????????????mg[i][j]=-1;????????//避免重復走到該結點
????????}else{
????????????mg[Stack[top].i][Stack[top].j]=0;???//讓該位置變為其他路徑的可走結點
????????????top--;
????????}
????}

????printf("最短路徑如下:\n");
????printf("長度:??%d\n",minlen);
????printf("路徑:??");
????for(k=0;k<minlen;k++){
????????printf("(%d,%d)??",Path[k].i,Path[k].j);
????????if((k+1)%5==0)??????//輸出時每5個結點換一行
????????????printf("\n\t");
????}
????printf("\n");
}

int main(){
????printf("迷宮所有路徑如下:\n");
????mgpath();
????return 0;
}

總結

以上是生活随笔為你收集整理的求解迷宫问题的所有路径及最短路径程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。