迷宫有n行m列的单元格组成(n和m都小于等于50),每个单元格内要么是空地,要么是障碍物。找到一条从迷宫的起点通往迷宫内任意一点的最短路径。
注意:
障碍物是不能走的,也不能走到迷宫之外。
#include <stdio.h>
#include <iostream>
int n, m, p, q,len, min = 99999999;
int a[51][51], book[51][51];
char b[51][3];
void dfs(int x, int y, int step)
{
int next[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
int tx, ty, k,i,j;
//判断是否到达目的地
if (x == p&&y == q)
{
//更新最小值
if (step < min)
{
len = 0;
min = step;
for (i = 0; i <= 51; i++)
{
for (j = 0; j <= 51; j++)
{
if (book[i][j] == 1)
{
b[len][0] = i + '0'; //不可以直接‘i’,这样存入的就是字符i,而不是i所代表的数值
b[len][1] = ',';
b[len][2] = j + '0';
len++;
}
}
}
}
return ;//这里返回值很重要
}
//枚举四种走法
for (k = 0; k <= 3; k++)
{
//计算下一个点的坐标
tx = x + next[k][0];
ty = y + next[k][1];
//判断是否越界
if (tx<1 || tx>n || ty<1 || ty>m)
continue;
//判断该点是否为障碍物或者已经在路径中
if (a[tx][ty] == 0 && book[tx][ty] == 0)
{
book[tx][ty] = 1;//标记这个点已经走过
dfs(tx, ty, step + 1);//开始尝试下一点
book[tx][ty] = 0;//尝试结束,取消这个点的标记
}
}
return ;
}
int main()
{
int i, j, startx, starty;
//读入n和m,n为行,m为列
scanf_s("%d %d", &n, &m);
//读入迷宫
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
scanf_s("%d", &a[i][j]);
}
}
//读入起点和终点坐标
scanf_s("%d %d %d %d", &startx, &starty, &p, &q);
//从起点开始搜索
book[startx][starty] = 1;//标记起点已经在路径中,防止后面重复走
dfs(startx,starty,0);
printf("min = %d\n", min);
for (i = 0; i < len; i++)
{
for (j = 0; j < 3; j++)
{
printf("%c", b[i][j]);
}
printf("\t");
}
system("pause");
return 0;
}
运行结果: