深度优先搜索之走迷宫问题

本题也是在啊哈磊的《啊哈算法》中看到的,自己也总结了一点,这本书作者遍历数组时候,数组的下标在书里都是从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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

囿于之间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值