#include<stdio.h> #include<stdlib.h> #define MaxSize 100 int M=8,N=8; int mg[10][10]={ {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} }; typedef struct { int i,j; //i,j分别为横纵坐标 int pre; //路径的方向 }Box; typedef struct { Box data[MaxSize]; int front,rear; }QuType; void print(QuType qu,int front); int mgpath(); int mgpath(int xi,int yi,int xe,int ye) { int i,j,find=0,di; QuType qu; qu.front=qu.rear=-1; //队列初始化 qu.rear++; qu.data[qu.rear].i=xi; //起点进队 qu.data[qu.rear].j=yi; qu.data[qu.rear].pre=-1; mg[xi][yi]=-1; while(qu.front!=qu.rear&&!find) //队不空和未找到合适位置时循环 { qu.front++; i=qu.data[qu.front].i; j=qu.data[qu.front].j; if(i==xe&&j==ye) { find=1; print(qu,qu.front); return 1; } for(di=0;di<4;di++) { switch(di) { case 0:i=qu.data[qu.front].i-1;j=qu.data[qu.front].j;break; case 1:i=qu.data[qu.front].i;j=qu.data[qu.front].j+1;break; case 2:i=qu.data[qu.front].i+1;j=qu.data[qu.front].j;break; case 3:i=qu.data[qu.front].i;j=qu.data[qu.front].j-1;break; } if(mg[i][j]==0) { qu.rear++; qu.data[qu.rear].i=i; qu.data[qu.rear].j=j; qu.data[qu.rear].pre=qu.front; mg[i][j]=-1; } } } return 1; } void print(QuType qu,int front) { int k=front,j,ns=0; printf("\n"); do { j=k; k=qu.data[k].pre; qu.data[j].pre=-1; }while(k!=0); //反向搜索找出最短路径 printf("迷宫路径图如下:\n"); k=0; while(k<64) { if(qu.data[k].pre==-1) { ns++; printf("\t(%d,%d)",qu.data[k].i,qu.data[k].j); if(ns%5==0) printf("\n"); } k++; } printf("\n"); } int main() { if(!mgpath(1,1,M,N)) printf("该迷宫问题没有解!"); return 0; }
数据结构-顺序队列解决最短迷宫路径问题
最新推荐文章于 2023-12-19 09:13:10 发布