数据结构_迷宫

#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;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值