- 有一个5x4大小的迷宫,请你找出第一行第一列单元格到第四行第三列的最短路径。
- 其中第一行第三列,第三行第三列,第四行第二列,第五行第四列有障碍物,无法通过。
- 用dfs算法实现。
代码————————————————————————
#include <stdio.h>
int n, m, p, q, min = 99999;
int a[51][51], book[51][51];
void dfs(int x,int y,int step)//step表示现在处理第几个数
{
int next[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };//next数组代表了行进的方向
int tx, ty,k;//用tx,ty存储下一个点的坐标
//判断是否到了需要到达的位置
printf("(%d,%d)", x, y);
if (x == p && y == q)
{
printf("\n");
//更新了最小值
if (step < min)
{
min = step;
}
return;
}
//枚举4种走法
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为列
printf("请输入迷宫行列信息:");
scanf("%d %d", &n, &m);
printf("\n");
//读入迷宫信息
printf("请输入迷宫信息:");
for(i=1;i<=n;i++)
for (j = 1; j <= m; j++)
{
scanf("%d", &a[i][j]);
}
printf("\n");
printf("请输入起点坐标和终点坐标:");
scanf("%d %d %d %d", &startx, &starty, &p, &q);
//从起点开始搜索
book[startx][starty] = 1;//标记起点已经在路径中,防止后面重复走
//第一个参数是起点的x坐标,第二个参数是起点的y坐标,第三个参数是初始步数为0
printf("路径为:\n");
dfs(startx, starty, 0);
//输出最短步数
printf("最短路径为:%d", min);
return 0;
}
结果: