求解迷宫问题的所有路径及最短路径程序
| ?路障 | ?路障 | ?路障 | ?路障 | ?路障 | ?路障 |
| ?路障 | ?入口 | ? | ? | ?路障 | ?路障 |
| ?路障 | ? | ?路障 | ? | ? | ?路障 |
| ?路障 | ? | ? | ? | ?路障 | ?路障 |
| ?路障 | ?路障 | ? | ? | 出口? | ?路障 |
| ?路障 | ?路障 | ?路障 | ?路障 | ?路障 | ?路障 |
如上圖,,要求輸出迷宮的所有路徑,并求出最短路徑長度及最短路徑。。。。。。
入口坐標設為(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;
}
總結
以上是生活随笔為你收集整理的求解迷宫问题的所有路径及最短路径程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 23种设计模式及其对应实例-转
- 下一篇: Mac 使用SSH远程登录