本题也是在啊哈磊的《啊哈算法》中看到的,自己也总结了一点,这本书作者遍历数组时候,数组的下标在书里都是从1开始的。
该迷宫问题的大概要求就是现在键盘上输入一个矩阵做迷宫地图,用0表示空地可走,1表示有障碍物,现在由你自己在键盘上输入一个入口坐标,一个目标坐标,,每执行上下左右则路径长度加一,然后用程序计算出从入口到目标坐标的最短路径。
代码如下:
#include<stdio.h>
int n,m,p,q,min=99999999;
int a[51][51],book[51][51];//a数组用于遍历迷宫地图 book数组用于标记地图上的某一个坐标是否走过
void dfs(int x,int y,int step)
{
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//注意这里是一个4行2列,{0,1}向右,{1,0}向下,{0,-1}向左,{-1,0}向上
int tx,ty,k;
if(x==p&&y==q)//判断是否到达目标位置
{
if(step<min)
{
min=step;//更新最小路径
}
return ;
}
for(k=0;k<=3;k++)//枚举4种走法
{
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;
scanf("%d %d",&n,&m);//输入迷宫地图的行列
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);//两层for循环遍历迷宫地图
}
}
scanf("%d %d %d %d",&startx,&starty,&p,&q);//入口坐标和目标坐标
book[startx][starty]=1;
dfs(startx,starty,0);//0表示站在入口位置还没有开始走
printf("%d",min);
getchar();
getchar();
return 0;
}
/*样例输入 1表示该坐标有障碍物,0代表空地
5 4 第一行表示是一个5行4列的迷宫
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3 最后一行前两个1代表入口坐标 后两个43 代表需要到达的位置
*/
本题也运用了深度优先搜索的思想,相当于把所有能走的路都走一遍,实时更新最小路径,大家可以在纸上自己模拟一下过程,过程和我之前博客里的全排列问题几乎一样。
PS:一定用注意递归函数里面的两个return。