自动生成迷宫,并求出最短路径,代码没问题,但总是运行不了


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
#define M 10
#define MaxSize 1000

int mg[M + 2][N + 2];
struct
{
    int i, j;
    int di;
} St[MaxSize], Path[MaxSize];

int top = -1;
int count = 1;
int minlen = MaxSize;

void generate_maze()
{
    // 初始化迷宫为全墙
    for (int i = 0; i < M + 2; i++)
    {
        for (int j = 0; j < N + 2; j++)
        {
            mg[i][j] = 1;
        }
    }

    // 随机挖掉某些墙,生成通路
    srand(time(NULL));
    for (int i = 1; i <= M; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            if (i == 1 && j == 1) // 起点
            {
                mg[i][j] = 0;
            }
            else if (i == M && j == N) // 终点
            {
                mg[i][j] = 0;
            }
            else
            {
                if (rand() % 3 == 0) // 有1/3的概率挖掉当前格子上面的墙
                {
                    mg[i - 1][j] = 0;
                }
                if (rand() % 3 == 0) // 有1/3的概率挖掉当前格子右边的墙
                {
                    mg[i][j + 1] = 0;
                }
            }
        }
    }
}

void dispapath()
{
    int k;
    printf("%5d:", count++);
    for (k = 0;k <= top;k++)
        printf("(%d%d)", St[k].i, St[k].j);
    printf("\n");
    if (top + 1 < minlen)
    {
        for (k = 0;k <= top;k++)
            Path[k] = St[k];
        minlen = top + 1;
    }
}

void dispminpath()
{
    printf("最短路径如下:\n");
    printf("长度:%d\n", minlen);
    printf("路径:");
    for (int k = 0;k < minlen;k++)
        printf("(%d%d)", Path[k].i, Path[k].j);
    printf("\n");
}

void mgpath(int xi, int yi, int xe, int ye)
{
    int i, j, i1, j1, di;
    bool find;

    top++;
    St[top].i = xi;
    St[top].j = yi;
    St[top].di = -1;
    mg[xi][yi] = -1;

    while (top > -1)
    {
        i = St[top].i;
        j = St[top].j;
        di = St[top].di;

        if (i == xe && j == ye)
        {
            dispapath();
            mg[i][j] - 0;
            top--;
            i = St[top].i;
            j = St[top].j;
            di = St[top].di;
        }

        find = false;
        while (di < 4 && !find)
        {
            di++;
            switch (di)
            {
            case 0:i1 = i - 1;j1 = j;break;
            case 1:i1 = i;j1 = j + 1;break;
            case 2:i1 = i + 1;j1 = j;break;
            case 3:i1 = i;j1 = j - 1;break;
            }
            if (mg[i1][j1] == 0)find = true;
        }

        if (find)
        {
            St[top].di = di;
            top++;
            St[top].i = i1;
            St[top].j = j1;
            St[top].di = -1;
            mg[i1][j1] = -1;
        }
        else
        {
            mg[i][j] = 0;
            top--;
        }
    }

    dispminpath();
}

int main()
{
    generate_maze();

    printf("迷宫如下:\n");
    for (int i = 1; i <= M; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            if (mg[i][j] == 0)
            {
                printf("  "); // 通路
            }
            else if (mg[i][j] == 1)
            {
                printf("[]"); // 墙
            }
            else
            {
                printf("**"); // 路径
            }
        }
        printf("\n");
    }

    printf("迷宫所有路径如下:\n");
    mgpath(1, 1, M, N);

    return 0;
}

这个代码貌似没问题,但是“0x00007FF6BFF41FF6 处(位于 maze 2.exe 中)引发的异常: 0xC0000005: 写入位置 0x00007FF6BFF4CFFC 时发生访问冲突。”
有什么解决方法吗?
另外可不可以给这个程序做一个好看的界面?


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
#define M 10
#define MaxSize 1000
 
int mg[M + 2][N + 2];
struct
{
    int i, j;
    int di;
} St[MaxSize], Path[MaxSize];
 
int top = -1;
int count = 1;
int minlen = MaxSize;
 
void generate_maze()
{
    // 初始化迷宫为全墙
    for (int i = 0; i < M + 2; i++)
    {
        for (int j = 0; j < N + 2; j++)
        {
            mg[i][j] = 1;
        }
    }
 
    // 随机挖掉某些墙,生成通路
    srand(time(NULL));
    for (int i = 1; i <= M; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            if (i == 1 && j == 1) // 起点
            {
                mg[i][j] = 0;
            }
            else if (i == M && j == N) // 终点
            {
                mg[i][j] = 0;
            }
            else
            {
                if (rand() % 3 == 0) // 有1/3的概率挖掉当前格子上面的墙
                {
                    mg[i - 1][j] = 0;
                }
                if (rand() % 3 == 0) // 有1/3的概率挖掉当前格子右边的墙
                {
                    mg[i][j + 1] = 0;
                }
            }
        }
    }
}
 
void dispapath()
{
    int k;
    printf("%5d:", count++);
    for (k = 0;k <= top;k++)
        printf("(%d%d)", St[k].i, St[k].j);
    printf("\n");
    if (top + 1 < minlen)
    {
        for (k = 0;k <= top;k++)
            Path[k] = St[k];
        minlen = top + 1;
    }
}
 
void dispminpath()
{
    printf("最短路径如下:\n");
    printf("长度:%d\n", minlen);
    printf("路径:");
    for (int k = 0;k < minlen;k++)
        printf("(%d%d)", Path[k].i, Path[k].j);
    printf("\n");
}
 
void mgpath(int xi, int yi, int xe, int ye)
{
    int i, j, i1, j1, di;
    bool find;
 
    top++;
    St[top].i = xi;
    St[top].j = yi;
    St[top].di = -1;
    mg[xi][yi] = -1;
 
    while (top > -1)
    {
        i = St[top].i;
        j = St[top].j;
        di = St[top].di;
 
        if (i == xe && j == ye)
        {
            dispapath();
            mg[i][j] = 0;
            top--;
            i = St[top].