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

来源:互联网 发布:家装三维设计软件 编辑:程序博客网 时间:2024/05/06 09:35
问题描述:


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           1000int 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};intDFS_maze(int x,int y){int i,nx,ny;if( maze[x][y] == 'e' ) {ans++;return 1;}//记录并赋值为1char 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;}intmain(void){int i = 0,j;scanf("%d%d",&N,&M);while( i < N ){scanf("%s",maze[i]);i++;}#if Testi = 0;while( i < N )puts(maze[i++]);#endif // test successfor(i = 0;i < N; i++){for(j = 0; j < M; j++)if( maze[i][j] == 's' )break;if( maze[i][j] == 's' )break;}#if Testputchar(maze[0][0]);printf("i = %d j = %d\n",i,j);#endifif( i < N && j < M ){DFS_maze(i,j);printf("%d\n",ans);}elseprintf("程序没有搜索到起点!请设置起点\n");return 0;}


0 0
原创粉丝点击