队列实现求迷宫最短路径(包含每一步的尝试状态,迷宫随机生成)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Maxsize 50
int mg[10][10];
void shengcheng()
{
    for(int i=0; i<10; i++)
    {
        mg[i][0]=1;
        mg[i][9]=1;
        mg[0][i]=1;
        mg[9][i]=1;
    }
    srand(time(NULL));
    for(int i=1; i<9; i++)
    {
        mg[1][1]=0;
        for(int j=1; j<9; j++)
        {
            mg[i][j]=rand()%2;
            mg[8][8]=0;
        }
    }
    for(int i=0; i<10; i++)
    {
        for(int j=0; j<10; j++)
        {
            printf("%d ",mg[i][j]);
            if(j==9)
                printf("\n");
        }
    }
}
typedef struct
{
    int i;
    int j;
    int pre;
} Box;
typedef struct
{
    Box data[Maxsize];
    int front1;
    int rear;
} QuType;
void print(QuType qu,int front2);
bool mgpath1(int xi,int yi,int xe,int ye)
{
    int i,j,find1=0,p,di,o,q;
    QuType qu;
    qu.front1=qu.rear=-1;
    qu.rear++;
    qu.data[qu.rear].i=xi;
    qu.data[qu.rear].j=yi;
    qu.data[qu.rear].pre=-1;
    mg[xi][xi]=-1;
    while(qu.front1!=qu.rear&&!find1)
    {
        qu.front1++;
        i=qu.data[qu.front1].i;
        j=qu.data[qu.front1].j;
        o=i;
        q=j;
        printf("开始探索%d,%d周围的通路\n",i,j);
        if(i==xe&&j==ye)
        {
            find1=1;
            printf("迷宫有通路\n");
            print(qu,qu.front1);
            return true;
        }
        for(di=0; di<4; di++)
        {
            switch(di)
            {
            case 0:
                p=0;
                i=qu.data[qu.front1].i-1;
                j=qu.data[qu.front1].j;
                break;
            case 1:
                p=1;
                i=qu.data[qu.front1].i;
                j=qu.data[qu.front1].j+1;
                break;
            case 2:
                p=2;
                i=qu.data[qu.front1].i+1;
                j=qu.data[qu.front1].j;
                break;
            case 3:
                p=3;
                i=qu.data[qu.front1].i;
                j=qu.data[qu.front1].j-1;
                break;
            }
            if(mg[i][j]==0)
            {
                switch(p)
                {
                case 0:
                    printf("向上探索,上有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
                    break;
                case 1:
                    printf("向右探索,右有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
                    break;
                case 2:
                    printf("向下探索,下有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
                    break;
                case 3:
                    printf("向左探索,左有通路,坐标为:%d,%d,上一个通路的坐标为:%d,%d\n",i,j,qu.data[qu.front1].i,qu.data[qu.front1].j);
                    break;
                }
                qu.rear++;
                qu.data[qu.rear].i=i;
                qu.data[qu.rear].j=j;
                qu.data[qu.rear].pre=qu.front1;
                mg[i][j]=-1;
            }
        }
        printf("%d,%d周围没有通路了!\n",o,q);
    }
    return false;
}
void print(QuType qu,int front2)
{
    int k=front2,j;
    printf("\n");
    do
    {
        j=k;
        k=qu.data[k].pre;
        qu.data[j].pre=-1;
    }
    while(k!=0);
    printf("迷宫路径如下:\n");
    k=0;
    while(k<qu.rear)
    {
        if(qu.data[k].pre==-1)
        {
            printf("<%d,%d>  ",qu.data[k].i,qu.data[k].j);
            mg[qu.data[k].i][qu.data[k].j]=5;
        }
        k++;
    }
    printf("\n");
    for(int i=0; i<10; i++)
    {
        for(int j=0; j<10; j++)
        {
            printf("%d  ",mg[i][j]);
            if(j==9)
                printf("\n");
        }
    }
    printf("\n");
}
int main()
{
    int n;
    printf("1.开始\n");
    printf("2.退出\n");
    while(scanf("%d",&n)!=EOF)
    {
        switch(n)
        {
        case 1:
            shengcheng();
            if(!mgpath1(1,1,8,8))
                printf("迷宫没有路!\n");
            break;
        case 2:
            exit(0);
        }
        printf("\n\n\n");
        printf("1.继续\n");
        printf("2.退出\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值