数据结构_迷宫

来源:互联网 发布:xenomai编程笔记 编辑:程序博客网 时间:2024/04/30 19:22
#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;}

1 0