/* 迷宫问题 采用队列的广度优先遍历(BFS):思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域 找到的解为最优解 */ #include<stdio.h> #define M 8 #define N 8 #define MaxSize 1000 typedef struct { int i,j; int pre;//该路径前一个节点 ,这个变量的定义很重要 }Box; typedef struct { Box data[MaxSize]; int front,rear; }QuType;//迷宫问题队列结构体表示形式 int mg[M+2][N+2]= { {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} }; QuType qu; void print(int front)//递归打印最短路径 { if(qu.data[front].pre!=-1) print(qu.data[front].pre); printf("(%d,%d)\t",qu.data[front].i,qu.data[front].j); } int mgpath(int xi,int yi,int xe,int ye) { int i,j,di; 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) { qu.front++; i=qu.data[qu.front].i; j=qu.data[qu.front].j; if(i==xe&&j==ye) { print(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 0; } int main() { mgpath(1,1,M,N); return 0; }