迷宫问题 C语言实现(深搜)

问题描述:

2015年05月21日 10:24:05
这是我自己出的一道题   其原型基于迷宫问题,用深搜来解决的!我就简单的说一说吧!

给定一个N * M 的迷宫!,1代表有障碍,0代表无障碍可通行的!
每个迷宫只可以有一个起始点和一个出口!,但可以0或多条通往出口的路。
程序会自动计算出有多少条通往出口的路!分别用s 来代表起点 e代表终点

约定
N,M <= 1000

样例输入
N = 4
M = 4
s010
1000
1100
e001

输出 

2

这个问题我用的是深度搜索来解决的。当然还有很多种算法也可以解决这样的问题。如果有同学有比我的这个更好的算法我很欢迎告诉我。我也要学习学习!

深度搜索的意图是很明显的,它的用法是先检查一个节点,如果有子节点它会继续遍历下去,如果没有就会回溯回去,有点类似于前序遍历!

#include <stdio.h>

/*
**	开始设计时间:2015-05-21 10:35:19
**	设计思路:这道题我是打算用深搜来做的了。
**		      我在思考的一个问题就是怎样才能让程序不走回头路!我的想法是在程序进栈时
**			  就把这现在处于的这个点赋值为1.这样就能保证程序不会走回头路!
**	设计结束时间:2015年05月21日 12:49:49
**	总结:中间吃了个饭。设计过程中出现了两个问题,一个是main函数中的那个if(maze[i][j] == 's') break跳出来直跳了一个
**	就导致了没能进入DFS
**	第二个问题是:进入了DFS之后发现怎样结果都是0,问题在于赋值在判断之前,连带e也给赋值掉了!。所以就一直是0
**	这些问题都不算大,逻辑起码还算清晰,就是有点没睡醒,!加油把 talent。
*/

#define Test			 0
#define MAX           1000

int N,M,ans = 0;
char maze[MAX][MAX + 1];

struct dir{
	int dx;
	int dy;
}d[4] = {
	{1,0},//up
	{-1,0},//down
	{0,-1},//left
	{0,1}//right
};



int
DFS_maze(int x,int y)
{
	int i,nx,ny;
	
	if( maze[x][y] == 'e' ) 
	{
		ans++;
		return 1;
	}
	//记录并赋值为1
	char temp = maze[x][y];
	maze[x][y] = '1';
	for(i = 0;i < 4;i++)
	{
			nx = x + d[i].dx;
			ny = y + d[i].dy;
			if( nx < N && nx >= 0 && ny < M && nx >= 0 && ( maze[nx][ny] == '0' || maze[nx][ny] == 'e' ) )
				DFS_maze(nx,ny);
	}
	maze[x][y] = temp;
	return 0;
}


int
main(void)
{
	int i = 0,j;
	scanf("%d%d",&N,&M);
	
	while( i < N )
	{
		scanf("%s",maze[i]);
		i++;
	}
	
	
	#if Test
	i = 0;
	while( i < N )
		puts(maze[i++]);
	#endif // test success
	for(i = 0;i < N; i++)
	{
		for(j = 0; j < M; j++)
			if( maze[i][j] == 's' )
				break;
		
		if( maze[i][j] == 's' )
				break;
	}
	#if Test
	putchar(maze[0][0]);
	printf("i = %d j = %d\n",i,j);
	#endif
	if( i < N && j < M )
	{
		DFS_maze(i,j);
		printf("%d\n",ans);
	}
	else
		printf("程序没有搜索到起点!请设置起点\n");
	return 0;
}
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/Darkness_hades/article/details/45932591
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞