解救小哈(dfs)

题目描述:

有一天,小哈一个人去玩迷宫。但是方向感很不好的小哈很快就迷路了。小哼得知后便立即去解救无助的小哈。小哼当然是有备而来,已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈。问题就此开始了......

迷宫由m行n列的单元格组成的(m和n都小于50),每个单元格要么是空地要么是障碍物,你的任务是帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。

输入:

第一行有两个数m n。m表示迷宫的行,n表示迷宫的列。

接下来的m行n列为迷宫,0表示空地,1表示障碍物。

最后一行4个数,前两个数为迷宫入口的x和y坐标。后两个为小哈的x和y坐标。

输出:

输出小哼找到小哈走的最少步数。

样例输入:

5 4

0 0 1 0

0 0 0 0

0 0 1 0

0 1 0 0

0 0 0 1

0 0 3 2

样例输出:

7

程序代码:

#include<stdio.h>
#include<string.h>
int m,n,p,q,min;
int a[60][60],book[60][60];
void dfs(int x,int y,int step);
int main()
{
	int i,j,startx,starty;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		min=99999999;
		memset(book,0,sizeof(book));
		for(i=0;i<m;i++)	
			for(j=0;j<n;j++)
				scanf("%d",&a[i][j]);
		scanf("%d%d%d%d",&startx,&starty,&p,&q);
		book[startx][starty]=1;//标记起点已经在路径中防止后面重复走 
		dfs(startx,starty,0);
		printf("%d\n",min);
	}
	return 0;
} 
void dfs(int x,int y,int step)
{
	int next[4][2]={1,0,0,1,-1,0,0,-1};
	int tx,ty,k;
	if(x==p&&y==q)//判断是否到达小哈的位置 
	{
		if(step<min)
			min=step;
		return;
	}
	for(k=0;k<4;k++)
	{
		tx=x+next[k][0];
		ty=y+next[k][1];
		if(tx<0||tx>=m||ty<0||ty>=n)
			continue;
		if(a[tx][ty]==0&&book[tx][ty]==0)//判断改点是否是障碍物或者已经在路径中 
		{
			book[tx][ty]=1;//标记这个点已经走过 
			dfs(tx,ty,step+1);//开始尝试下一个点 
			book[tx][ty]=0;//尝试结束,取消这个点的标记 
		}
	}
	return;
}

猜你喜欢

转载自blog.csdn.net/HeZhiYing_/article/details/80380009