#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
int bz[10][10]; //标记
typedef struct//代表一个点
{
int x; //行
int y; //列
int dept; //方向,dept=1代表右,dept=2代表下,dept=3代表左,dept=2代表上
}point;
typedef struct //构造栈
{
point *base;
point *top;
int stacksize;
}SqStack;
int maze[10][10]= //等于1代表通不过,0代表能通过,2代表已经走过
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,1,1,1,1,1,1},
{1,0,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,1,1,1,1,1,1,0,1},
{1,0,1,1,1,1,1,1,0,1},
{1,0,1,1,1,1,1,1,0,1},
{1,0,1,1,1,1,1,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int InitStack(SqStack *s) //栈的初始化
{
s->base=(point *)malloc(100*sizeof(point));
if (!s->base) return -2;
s->top=s->base;
s->stacksize=100;
return 1;
}
int Pop(SqStack *s,point *e) //出栈
{
if (s->base==s->top) return 0;
*e=*--s->top;
return 1;
}
int Push(SqStack *s,point e) //入栈
{
if (s->base-s->top>=s->stacksize)
{
s->base=(point *)realloc(s->base,(100+10)*sizeof(point));
if (!s->base) return -2;
s->top=s->base+s->stacksize;
s->stacksize=100+10;
}
*s->top++=e;
return 1;
}
void ptint(SqStack s,point *q) //输出可走的路径
{
memset(bz,0,sizeof(bz));
int t=0;
while (s.base!=s.top)
{
bz[(*s.base).x][(*s.base).y]=1;
s.base++;
}
bz[q->x][q->y]=1;
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (bz[i][j]==1)
{
printf("# ");
}
if (bz[i][j]==0)
{
printf("。");
}
}
printf("\n");
}
}
int DFS(SqStack *s,point *e,point *q) //深搜遍历
{
static int i=1; //第个路径
while (1)
{
while (e->dept<=4) //如果四周都不通,则退出
{
switch (e->dept)
{
case 1:
if (maze[e->x][e->y+1]==0) //如果下面的一步可以走
{
maze[e->x][e->y]=2; //则标记为已走
Push(s,*e); //入栈
e->y++; //坐标加1
e->dept=1; //方向变为1进行下一步
}
else e->dept++; //如果下面的一步不可走则继续找其他方向
break;
case 2:
if (maze[e->x+1][e->y]==0)
{
maze[e->x][e->y]=2;
Push(s,*e);
e->x++;
e->dept=1;
}
else e->dept++;
break;
case 3:
if (maze[e->x][e->y-1]==0)
{
maze[e->x][e->y]=2;
Push(s,*e);
e->y--;
e->dept=1;
}
else e->dept++;
break;
case 4:
if (maze[e->x-1][e->y]==0)
{
maze[e->x][e->y]=2;
Push(s,*e);
e->x--;
e->dept=1;
}
else e->dept++;
break;
}
}
if (s->base==s->top) return 0; //如果回到的起点表示走不通
if (!(e->x==q->x&&e->y==q->y)) //还没找到了终点
{
Pop(s,e); //弹栈往后退一个节点
e->dept++;
maze[e->x][e->y]=0;
}
else break; //找到了终点,退出for
}
printf("第%d条路径:\n",i++);
ptint(*s,q); //输出路径
return 1;
}
int main()
{
SqStack s;
point e,q;
InitStack(&s);
printf("请输入入口的横纵坐标:\n");
scanf("%d%d",&e.x,&e.y);
printf("请输入出口的横纵坐标:\n");
scanf("%d%d",&q.x,&q.y);
e.dept=1; //方向置为1
if (!DFS(&s,&e,&q)) printf("走不通\n");
else
{
while (s.base!=s.top)//直到走完所有的方向
{
Pop(&s,&e);
e.dept++;
maze[e.x][e.y]=0;
DFS(&s,&e,&q);
}
}
//DFS(&s,&e,&q);
return 0;
}
数据结构_迷宫
最新推荐文章于 2024-03-13 20:22:31 发布