#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].