实验三的迷宫问题

先上代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 7
#define MAX 1024 
//typedef int Elemtype;
typedef struct//路径方块查找方向的数据结构 
{
    int x;
    int y;
}Direction;

typedef struct //路径方块的数据结构 
{
    int row;//路径方块横坐标 
    int column;//路径方块纵坐标 
    int direction;//从当前路径查找下一方块方向 
}SElemType;
typedef struct SequenStack
{
    SElemType data[MAX];
    int top;
}SequenStack; 
SequenStack *S;
typedef SElemType elemtype; 
SequenStack *Init_SequenStack()//初始化栈
{
    SequenStack *S;
    S = (SequenStack*)malloc(sizeof(SequenStack));
    S->top = -1;
    return S;
}
int Push_SequenStack(SequenStack *S, elemtype x)//入栈 
{
    if (S->top >= MAX -1)
    {
        printf("栈满\n");//栈满不能入栈返回1; 
        return 1;
    }
    S->top++;
    S->data[S->top] = x;
    return 0;//入栈成功返回0; 
}
int SequenStack_Empty(SequenStack *S)//栈判空 
{
    if (S->top == -1)
        return 1;//空返回1 
    else
        return 0;// 非空返回0 
}
int GetTop_SequenStack(SequenStack *S,elemtype *x)//取栈顶元素 
{
    if (S->top == -1)
    {
        printf("栈空\n");//栈空返回1 
        return 1;
    }
    else
    {
        *x = S->data[S->top];//成功刚返回0; 
        return 0;
    }
}
int Pop_SequenStack(SequenStack *S, elemtype *x)//出栈 
{
    if (S->top == -1)
    {
        printf("栈空\n");//栈空返回1 
        return 1;
    }
    else
    {
        S->top--;
        *x = S->data[S->top + 1];
        return 0;//出栈成功返回0; 
    }
}
int path(SequenStack *s,int Maze[SIZE][SIZE],Direction Move[5])
{
    SElemType temp;
    SElemType tryPath;
    int x,y,d,i,j,tryTime;
    temp.row=1;
    temp.column=1;
    temp.direction=0;
    Push_SequenStack(s,temp);//将第一个路径方块如栈 
    while(!SequenStack_Empty(s))
    {
        GetTop_SequenStack(s,&temp);//取栈顶元素
        x=temp.row;
        y=temp.column;
        d=temp.direction+1;//设置查找方向
        tryTime=0;//设置当前路径方块查找次数
        while(d<=4)//对当前路径方块四个方向查找 
        {
            i=x+Move[d].x;//根据查找方向,设置相应方块坐标 
            j=y+Move[d].y;

            if(Maze[i][j]==0)
            {

                if(tryTime==0)//设置探查方向 
                {
                    Pop_SequenStack(s,&tryPath);// 出栈当前路径方块
                    tryPath.direction=d; //更新方向
                    Push_SequenStack(s,tryPath);//重新入栈
                    tryTime++; 
                }
                temp.row=i;
                temp.column=j;
                temp.direction=1;
                Push_SequenStack(s,temp);
                x=i;
                y=j;
                Maze[x][y]=-1;
                if(x==SIZE-2&&y==SIZE-2)//判断当前方块是否为出口 
                {
                    return 1;
                }
                else
                {
                    d=1;//继续探查 
                }
            }
            else//不可通过,查找下一个方向 
            {
                d++;
                tryTime=0;
            } 
        }//while结束 
        if(d==5&&!SequenStack_Empty(s)) 
        {
            Pop_SequenStack(s, &temp);
            Maze[x][y]='X';
        }
    }
    return 0;
}
void main()
{
    int a,i,j;
    int maze[SIZE][SIZE];
    srand((unsigned)time(NULL));
    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            maze[i][j]=1;
        }
    }
    for(i=1;i<SIZE-1;i++)
    {
        for(j=1;j<SIZE-1;j++)
        {
            if(i==1&&j==1)
            maze[i][j]=0;
            else
            maze[i][j]=rand()%2;
        }
    }
    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            if(maze[i][j]==1)
            printf("■");
            else
            printf("□");
        }
        printf("\n");
    }
    printf("\n");
    Direction Move[5]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};
    S=Init_SequenStack();
    a=path(S,maze,Move);
    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            if(i==1&&j==1)
            printf("△");
            else if(maze[i][j]==1)
            printf("■");
            else if(maze[i][j]==-1)
            printf("△");
            else
            printf("□");
        }
        printf("\n");
    }
    if(a==1)
    printf("成功找出\n");
    else
    printf("没有出路\n");
}

这是实验我是自己把它设置为随机数的形式,(自己输数太麻烦),主要函数也就是书上的,主要是把握栈的使用。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值