#include<malloc.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define M 50
#define N 50
typedef struct node //迷宫节点结构体
{
int row; //行号
int col; //列号
struct node *next; //下一个节点
}mazenode;
mazenode *stack;//定义一个栈
//寻找路径的函数,找到返回1,否则返回0
int findpath(int maze[][12],int x1,int x2,int y1,int y2)
{
mazenode *p;
if(maze[x1][y1]==0)
{
p=(mazenode *)malloc(sizeof(mazenode));
printf(“x1=%d, y1=%d, x2=%d, y2=%d\n”, x1, y1, x2, y2);
p->row=x1;
p->col=y1;
p->next=NULL;
stack=p; //将入口放入堆栈
maze[stack->row][stack->col]=1;//标志入口已访问
while((!(stack->row==-1&&stack->col==-1))&&(!(stack->row==x2&&stack->col==y2)))//未找到出口并且堆栈不空
{
if(maze[stack->row+1][stack->col]==0) //下面可通
{
//printf(“下\n”);
p=(mazenode *)malloc(sizeof(mazenode));
p->row=stack->row+1;
p->col=stack->col;
p->next=stack; //入栈
stack=p;
maze[stack->row][stack->col]=1; //标记已访问
}
else if(maze[stack->row][stack->col+1]==0) //右面位置可通
{
//printf(“右\n”);
p=(mazenode *)malloc(sizeof(mazenode));
p->row=stack->row;
p->col=stack->col+1;
p->next=stack; //入栈
stack=p;
maze[stack->row][stack->col]=1;//标记已访问
}
else if(maze[stack->row-1][stack->col]==0) //左面可通
{
//printf(“左\n”);
p=(mazenode *)malloc(sizeof(mazenode));
p->row=stack->row-1;
p->col=stack->col;
p->next=stack; //入栈
stack=p;
maze[stack->row][stack->col]=1;//标记已访问
}
else if(maze[stack->row][stack->col-1]==0)//上面可通
{
//printf(“上\n”);
p=(mazenode *)malloc(sizeof(mazenode));
p->row=stack->row;
p->col=stack->col-1;
p->next=stack; //入栈
stack=p;
maze[stack->row][stack->col]=1;//标记已访问
}
else //不可通返回上一点
{
//printf(“返回\n”);
if (stack->next!=NULL)
{ //堆栈里布置一个顶点则出栈并返回循环
//printf(“能返回\n”);
p=stack;
stack=stack->next; //出栈
free(p); //释放空间
}
else //堆栈里只有一个顶点即入口,此时若释放空间出栈会使循环
{ //控制语句无法比较(因为stack->col,stack->row都已不存在,)
//printf(“不能返回\n”);
stack->row=-1;
stack->col=-1;
stack->next=NULL;
}
}
}
if (stack->row==x2&&stack->col==y2)
return 1;
else
return 0;
}
else
return 0;
}
//打印路径函数
void printpath()
{
mazenode *q;
int i=1;
printf(“其中的一条通道为:\n”);
q=stack;
printf(” 出口<–“);
while (q!=NULL)
{
if(i%5==0)
printf(“\n”);
printf(“[%d%3d]<–“,q->row,q->col);
q=q->next;
i++;
}
printf(“入口\n”);
}
int main()
{
system(“color f0”); //背景为白色
int k=1,a=10,b=10, z, i, j;
int maze[12][12] ={{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,1,1,1,1,0,0,0,0,1},{1,0,0,0,0,0,1,0,1,0,0,1},{1,0,0,0,0,0,1,0,0,0,0,1},
{1,0,1,0,1,0,1,0,1,1,0,1},{1,0,1,0,1,0,1,0,1,0,0,1},{1,0,1,1,1,0,1,0,1,0,1,1},
{1,0,1,0,0,0,1,0,1,0,1,1},{1,0,1,0,0,1,1,0,1,0,1,1},{1,1,0,0,0,0,0,0,1,0,0,1},
{1,0,0,0,0,0,1,1,1,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1}
};
while(k!=0)
{
int x,x1,x2,y1,y2;
printf(“迷宫矩阵如下(0表示可通):\n “);
for(z=1;z<=b;z++)
{
printf(“%d “,z); //在矩阵上方标明列号
}
for(i=1;i<=a;i++)
{
printf(“\n”);
if(i<10)
printf(“%d “,i); //在矩阵左方标明行号
else
printf(“%d “,i);
for(j=1;j<=b;j++)
printf(“%d “,maze[i][j]);
}
printf(“\n迷宫入口为(1,1), 出口为(10,10)\n”);
x1=1, y1=1, x2=10, y2=10;
x=findpath(maze,x1,x2,y1,y2);
if(x==1) //迷宫可通
{
printf(“找到路径\n”);
printpath(); //打印坐标通路
}
else
printf(“无通路!\n”);//不可通
printf(“输入0结束:\n”);
scanf(“%d”,&k);
}
return 0;
}