Silence665 2022-01-02 02:29 采纳率: 75%
浏览 49
已结题

关于#c语言#的问题:迷宫出路

C语言
2表示墙,0表示通路,3表示入口,4表示出口。只能用指针访问数组中的数据,只能走直线。路线用坐标表示。
{2,3,2,2,2,2,2,2,2,2},
{2,0,0,0,0,0,2,0,0,2},
{2,0,2,0,2,0,0,0,0,2},
{2,0,0,2,0,2,0,0,0,2},
{2,2,0,2,0,2,0,2,0,2},
{2,0,0,0,0,0,0,0,0,2},
{2,2,2,0,2,2,0,2,0,2}
{2,2,2,0,2,2,0,0,0,2}
{2,2,0,2,2,2,0,0,0,2}
{2,2,2,2,2,2,2,2,4,2}

  • 写回答

1条回答 默认 最新

  • 关注

    你题目的解答代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #define M 10
    #define N 10
    #define Max 100
    int mg[M][N] = {//2表示墙,0表示通路,3表示入口,4表示出口
    {2,3,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,2,0,0,2},
    {2,0,2,0,2,0,0,0,0,2},
    {2,0,0,2,0,2,0,0,0,2},
    {2,2,0,2,0,2,0,2,0,2},
    {2,0,0,0,0,0,0,0,0,2},
    {2,2,2,0,2,2,0,2,0,2},
    {2,2,2,0,2,2,0,0,0,2},
    {2,2,0,2,2,2,0,0,0,2},
    {2,2,2,2,2,2,2,2,4,2}
    };
    struct
    {
        int i, j; //块的位置
        int pre;  //本路径中上一块在队列中的下标
    } Qu[Max];
    int front = -1, rear = -1;
    void print(int n);
    int mgpath(int xi, int yi, int xe, int ye) //搜索算法
    {
        int i, j, find = 0, di;
        rear++;
        Qu[rear].i = xi;
        Qu[rear].j = yi;
        Qu[rear].pre = -1;
        mg[xi][yi] = -1;
        while (front <= rear && !find)
        {
            front++;
            i = Qu[front].i;
            j = Qu[front].j;
            if (i == xe && j == ye)
            {
                find = 1;
                print(front);
                return (1);
            }
            for (di = 0; di < 4; di++)
            {
                switch (di) //四个方向
                {
                case 0:
                    i = Qu[front].i - 1;
                    j = Qu[front].j;
                    break;
                case 1:
                    i = Qu[front].i;
                    j = Qu[front].j + 1;
                    break;
                case 2:
                    i = Qu[front].i + 1;
                    j = Qu[front].j;
                    break;
                case 3:
                    i = Qu[front].i;
                    j = Qu[front].j - 1;
                    break;
                }
                if (i>=0 && i<M && j>=0 && j<N && (mg[i][j] == 0 || mg[i][j] == 4))
                {
                    rear++;
                    Qu[rear].i = i;
                    Qu[rear].j = j;
                    Qu[rear].pre = front;
                    mg[i][j] = -1; //避免死循环
                }
            }
        }
        return 0;
    }
    void print(int n) //输出 路径算法
    {
        int k = n, j;
        printf("\n");
        do //将输出的路径上的所有pre改为-1
        {
            j = k;
            k = Qu[k].pre;
            Qu[j].pre = -1;
        } while (k != 0);
        printf("迷宫最短路径如下:\n");
        k = 0;
        while (k < Max)
        {
            if (Qu[k].pre == -1)
            {
                printf("(%d,%d) ", Qu[k].i, Qu[k].j);
            }
            k++;
        }
        printf("\n");
    }
    int main()
    {
        int i,j, xi, yi, xe, ye;
        for (i = 0; i<M; i++)
        {
            for (j = 0; j<N; j++)
            {
                if (mg[i][j]==3)
                {
                    xi = i;
                    yi = j;
                }
                else if (mg[i][j]==4)
                {
                    xe = i;
                    ye = j;
                }
            }
        }
        mgpath(xi, yi, xe, ye);
        system("pause");
        return 0;
    }
    

    img

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月10日
  • 已采纳回答 1月2日
  • 创建了问题 1月2日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装