迷宫问题最短捷径c语言深搜,迷宫问题 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 /*

**开始设计时间: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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值