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;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!