关于#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}

你题目的解答代码如下:

#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