问题描述:
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;
}