迷宫问题里不能输出通路!程序比较长,希望指导一下!!!
程序代码:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct{ int x,y,d;}DataType; typedef struct{ int x,y; }item; typedef struct node{ DataType data; struct node *next; }StackNode,*PStackNode; typedef struct{ PStackNode top; }LinkStack,*PLinkStack; PLinkStack Init_LinkStack(void) { PLinkStack S; S=(PLinkStack)malloc(sizeof(LinkStack)); if(S) S->top=NULL; return(S); } int Empty_LinkStack(PLinkStack S) { return(S->top==NULL);} int Push_LinkStack(PLinkStack S,DataType x) { PStackNode p; p=(PStackNode)malloc(sizeof(StackNode)); if(!p) { printf("内存溢出"); return(0); } p->data=x; p->next=S->top; S->top=p; return(1); } int Pop_LinkStack(PLinkStack S,DataType *x) {PStackNode p; if(Empty_LinkStack(S)) { printf("栈空 不能出栈"); return(0); } *x=S->top->data; p=S->top; S->top=S->top->next; free(p); return(1); } void Destroy_LinkStack(PLinkStack *LS) {PStackNode p,q; if(*LS) { p=(*LS) ->top; while(p) { q=p; p=p->next; free(q); } free(*LS) ; } *LS=NULL; return; } void mg(int a[10][10], int m, int n) //创建迷宫并在四周设障碍 { int i, j; for (i = 0, j = 0; i < m + 2; i++) a[i][j] = 1; for (i = 0, j = n + 1; i < m + 2; i++) a[i][j] = 1; for (j = 0, i = 0; j < n + 2; j++) a[i][j] = 1; for (j = 0, i = m + 1; j < n + 1; j++) a[i][j] = 1; printf("Give me the map\n"); for (i = 1; i <= m; i++) for (j = 1; j <= n; j++) scanf("%d", &a[i][j]); } void print(int a[10][10], int m, int n) //打印迷宫 { int i, j; for (i = 0; i <= m + 1; i++) { for (j = 0; j <= n + 1; j++) { printf("%5d", a[i][j]); } printf("\n"); } } int mazepath(int maze[10][10],item *move,int x0,int y0,int m,int n) {/*求迷宫路径,入口参数:指向迷宫数组的指针,指向移动方向的指针,开始点(x0,y0),到达点(m,n),返回值:1表示求出路径,0表示无路径*/ PLinkStack S; DataType temp; int x,y,d,i,j; temp.x=x0;temp.y=y0;temp.d=-1; S= Init_LinkStack();/*初始化栈*/ if(!S) { printf("栈初始化失败"); return(0); } Push_LinkStack(S,temp);/*迷宫入点口入栈*/ while(!Empty_LinkStack(S)) { Pop_LinkStack(S,&temp); x=temp.x;y=temp.y;d=temp.d+1;maze[x][y]=0; while(d<4)/*存在剩余方向可以搜索*/ { i=x+move[d].x;j=y+move[d].y; if(maze[i][j]==0)/*此方向可走*/ {temp.x=x; temp.y=y; temp.d=d; Push_LinkStack(S,temp);/*点{x,y}可以走,用栈保存可以走的路径*/ x=i;y=j;maze[x][y]=-1; if(x==m &&y==n)/*迷宫有路*/ { while(!Empty_LinkStack(S)) { Pop_LinkStack(S,&temp); printf("(%d,%d)<-",temp.x,temp.y);/*打印可走的路径*/ } Destroy_LinkStack(&S);/*销毁栈*/ return 1; } else d=0;/*方向复位,从第一个方向开始试探*/ } else d++;/*试探下一个方向*/ } } Destroy_LinkStack(&S); return 0; } void main() { int r, c; item move[4]; int maze[10][10]; int x0=1; int y0=1; printf("Give me r & c\n"); scanf("%d,%d", &r, &c); mg(maze, r, c); printf("It's like this\n"); print(maze, r, c); printf("the mazepath is:\n"); mazepath(maze,move,x0,y0,r,c); }