码迷,mamicode.com
首页 > 其他好文 > 详细

迷宫(深度搜索dfs)

时间:2015-04-19 11:40:55      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:迷宫   dfs   

首先输入一个迷宫,用0,1表示,如:m行n列的迷宫

5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

0表示通路,1表示障碍。

然后输入起始点的坐标和终止点的坐标,求从起点到终点最少的步数。

用dfs,代码如下:

<span style="font-size:18px;">#include<stdio.h>
int book[51][51],p[51][51];
int min=99999,endx,endy;//因为终点坐标要在dfs和主函数中使用,所以应该用全局变量
	int m,n;
void dfs(int x,int y,int step)
{
	int tx,ty;
	int next[4][4]={{0,1},{-1,0},{0,-1},{1,0}};//数组代表上下左右四个方向
	if(x==endx&&y==endy)//当起点和终点相等的时候
	{
		if(step<min)//求最小步数
		min=step;
		return;//必须要有
	}
	for(int k=0;k<=3;k++)//从上下左右四个不同的方向进行搜索
	{
		tx=x+next[k][0];
		ty=y+next[k][1];
		if(tx<0||tx>=m||ty<0||ty>=n)//超出迷宫边界时,continue
		{
			continue;
		}
		if(book[tx][ty]==0&&p[tx][ty]==0)//如果当前坐标没有被走过,并且不是障碍
		{
			book[tx][ty]=1;//把当前坐标标记为走过
			dfs(tx,ty,step+1);进行下一阶段的dfs
			book[tx][ty]=0;回溯再次搜索时释放已标记的路径
		}
	}
	return;
}
int main(void)
{

	int beginx,beginy;
	scanf("%d%d",&m,&n);//输入行和列
	for(int i=0;i<m;i++)
	for(int j=0;j<n;j++)
	{
		scanf("%d",&p[i][j]);//输入迷宫,0,1表示
	}
	scanf("%d%d%d%d",&beginx,&beginy,&endx,&endy);//输入起点和终点的坐标
	book[beginx][beginy]=1;//book是标记数组,值为1的时候,代表此坐标已经走过,因为起点已经走过,所以首先置为1
	dfs(beginx,beginy,0);当前阶段已经做完,并且一步还没有走,所以转向下一个阶段
	printf("%d\n",min);
	return 0;
}</span>



迷宫(深度搜索dfs)

标签:迷宫   dfs   

原文地址:http://blog.csdn.net/u013240038/article/details/45126795

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!