#include<stdio.h> #include<stdlib.h> #define H_NUM 10 //迷宫行数 #define V_NUM 10 //迷宫列数 int maze[H_NUM][V_NUM]={ //0 1 2 3 4 5 6 7 8 9 /*0*/ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /*1*/ -1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1, /*2*/ -1,0 ,-1,-1,-1,-1,-1,-1,0 ,-1, /*3*/ -1,0 ,-1,-1,-1,-1,-1,-1,0 ,-1, /*4*/ -1,0 ,-1,-1,-1,-1,-1,-1,0 ,-1, /*5*/ -1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1, /*6*/ -1,0 ,-1,-1,-1,-1,-1,-1,0 ,-1, /*7*/ -1,0 ,-1,-1,-1,-1,-1,-1,0 ,-1, /*8*/ -1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1, /*9*/ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; typedef struct Maze{ int x,y; //坐标 struct Maze *next; } MazeNode; MazeNode *head=NULL; //全局的头指针 int step=0; //到达出口的步数 int min=0; //最小的路径长度 void MallocFailure() { printf("内存分配失败!"); exit(0); } //压栈 MazeNode* Push(int x,int y) { MazeNode* p=malloc(sizeof(struct Maze)); if(!p) MallocFailure(); p->x=x; p->y=y; if(head==NULL) { p->next=NULL; head=p; } else { p->next=head; head=p; } step++; //步数加一 return head; } //出栈 MazeNode* Pop() { if(head) { MazeNode* p=head; maze[p->x][p->y]=0; //还原路径(很重要) head=head->next; free(p); } step--; //步数减一 return head; } //输出路径 void PrintPath() { if(head) { MazeNode* p=head; while(p) { if(p==head) printf("[%d,%d]",p->x,p->y); else printf("<-[%d,%d]",p->x,p->y); p=p->next; } printf(" 总步数为:%d/n/n",step); if(min>step || min==0) min=step; //获取最短路径 } } //寻找路径 int FindPath(int x,int y) { int dir=0; //初始方向(0:向下;1:向右;2:向上;3:向左) int flag=0; //标记是否存在通路 if(x==1 && y==1) //如果为起点 { Push(1,1); //压栈 maze[1][1]=1; //标记为已走过 } if(x==H_NUM-2 && y==V_NUM-2) //到达终点 { PrintPath(); //输出路径 Pop(); //终点出栈 return 0; //到达终点,停止扫描 } else { while(dir<4) { switch(dir) { case 0: { if(maze[x+1][y]==0) { flag=1; Push(x+1,y); //将有通路的坐标点压栈 maze[x+1][y]=1; //标记当前点已走过 if(!FindPath(x+1,y)) //递归,若此方向上无法找到通路,则flag=0 flag=0; } } break; case 1: { if(maze[x][y+1]==0) { flag=1; Push(x,y+1); maze[x][y+1]=1; if(!FindPath(x,y+1)) flag=0; } } break; case 2: { if(maze[x-1][y]==0) { flag=1; Push(x-1,y); maze[x-1][y]=1; if(!FindPath(x-1,y)) flag=0; } } break; case 3: { if(maze[x][y-1]==0) { flag=1; Push(x,y-1); maze[x][y-1]=1; if(!FindPath(x,y-1)) flag=0; } } break; } dir++; //下一个方向 } if(!flag) //当前坐标点周围无通路 { Pop(); //将当前坐标点出栈 return 0; } } return 1; } int main(void) { FindPath(1,1); printf("最短路径长为:%d/n",min); }