www.pudn.com > MAZE_wdone.rar > MAZE_wdone.C
#include#include #include #define M 100 #define N 100 #define K 8 /*迷宫二维数组的行列大小*/ #define MAXLEN M*N int q; typedef struct /*结构体中x,y是坐标的行,列,d是记录方向的值*/ { int x; int y; int d; }Node; Node tempnode[M]; Node temp_node[M][N]; typedef struct ST /*定义栈的数据结构*/ { int top; Node data[MAXLEN]; }stack,*st; st t; /*建空栈*/ st create_emptystack() { st t; t=(st)malloc(sizeof(stack)); if(t==NULL) printf("Out of space!\n"); else t->top=-1; return t; } /*判断是否为空栈,空就置一*/ int if_empty_stack(st t) { if(t->top==-1) return 1; else return 0; } /*将元素n进栈*/ push_stack(st t,Node n) { if(t->top==MAXLEN-1) printf("Stack is full.\n"); else { t->top++; t->data[t->top]=n; } } /*栈顶元素出栈,指针指向下一元素*/ pop_stack(st t) { if(t->top==-1) printf("Stack is empty.\n"); else t->top--; } /*将当前的所有状态量压入栈顶*/ void pushtostack(st t,int x,int y,int d) { Node temp; temp.x=x; temp.y=y; temp.d=d; push_stack(t,temp); } /*获得栈顶元素*/ Node get_top(st t) { return (t->data[t->top]); } /*保存所有可行路径*/ void save_road(st t) { int flag; flag=t->top; q=0; t->top=0; while(!if_empty_stack(t)) { tempnode[q]=get_top(t); /*将路径保存到一个tempnode中*/ q++; if(t->top>=flag) break; t->top++; } } /*走迷宫路径*/ void MG_path(int mg[][K],int increase[4][2],int a,int b) /*increase是一个已存有方向增量的数组*/ { /*a,b是终点的行,列值*/ st S; Node tempvalue; int xn,yn,i,x,y; S=create_emptystack(); mg[1][1]=2; /*将起点标记为2*/ pushtostack(S,1,1,0); /*将它入栈*/ while(!if_empty_stack(S)) /*这是用来记录可行路径的一个循环体*/ { tempvalue=get_top(S); pop_stack(S); x=tempvalue.x; y=tempvalue.y; for(i=0;i<4;i++) /*4个方向分别作判断的循环体*/ { xn=x+increase[i][0]; yn=y+increase[i][1]; if(mg[xn][yn]==0) /*判断此方向上的下一个坐标是否可走*/ { mg[xn][yn]=2; /*先将下一个坐标变成2,以便和标记墙的1区分*/ pushtostack(S,x,y,i); /*间当前的坐标值入栈*/ x=xn;y=yn;i=-1; /*将这下一个坐标值变成下次循环的当前值*/ if(xn==a&&yn==b) /*判断是否到了终点*/ { pushtostack(S,xn,yn,i); save_road(S); /*保存将所有路径*/ return; } } } } printf("Sorry!!Fail to pass.\n"); } main() { int mgn[K][K]; int increase[][2]={0,1,1,0,0,-1,-1,0}; /*定义increase的方向变量*/ int incre_pre[M][2]; int a=0,b=0,c,r=0,i,j,s,t=0,v,k=-1; int m=0,flag=0,p,length[M],jl[M]; int mg[][K]={ 1,1,1,1,1,1,1,1, 0,0,1,0,1,0,0,1, 1,0,0,0,0,0,1,1, 1,0,1,0,1,0,1,1, /*初始化迷宫数组*/ 1,0,0,0,0,0,0,1, 1,0,1,0,1,1,0,1, 1,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1 }; while(t<=3) { for(s=t;s<=t+3;s++) /*此循环是为了让系统每次读取increase的值都不同*/ { if(k<3) /*如果循环到了increase最后的那个值时,k就标记为0*/ k++; else k=0; for(v=0;v<2;v++) /*将每次不同的increase值存到新数组incre_pre里*/ incre_pre[k][v]=increase[s%4][v]; } for(i=0;i 0) /*不同路径有不同长度*/ { if(p<10) printf("0%d---%d,%d",p,temp_node[t][p-1].x,temp_node[t][p-1].y); /*分0-9和9以上两种不同格式的输出*/ else printf("%d---%d,%d",p,temp_node[t][p-1].x,temp_node[t][p-1].y); if(p%4==0) /*下面是为了输出格式的好看*/ printf("\n"); else printf("\t\t"); p++; length[t]--; } printf("\n"); } getch(); printf("\n"); t++; } getch(); return 0; }