求助,关于深度优先探索和广度优先探索的一个问题

TGame 2012-11-26 01:36:01
大家好,最近遇见一个问题,

问题类似是这样的,比如一张T(NxN)地图,可走点用(x,y)=0表示,不可走的点用(x,y)=1表示,
每一步都可以往上下左右四个方向行走,请问从初始点(0,0)到目标点(x,x),
求有多少种走法(不考虑走回头路),并罗列出来

我感觉和深度优先探索算法的寻找路径有些相似,
但是深度优先探索只提供一个结果(一条路径)的吧,
但是我想知道所有可能的结果(所有可能路径),
请问各位有什么思路,或者有处理过类似问题的提供下算法思想,感谢!
...全文
274 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sepcity 2012-11-30
  • 打赏
  • 举报
回复
引用 14 楼 taquguodedifang 的回复:
引用 2 楼 sepcity 的回复:这个问题。。。BFS(广搜) DFS(深搜)都是可以做的 首先有一个问题。。。你说的不考虑走回头路是指已经走过的点不能再走吧。。 以下讲述就在此基础上 1.深搜的时候,如果搜到目标点,则输出当前路径,返回(即返回到上一个点,继续搜索,即可搜到所有路径) 2.广搜的时候,每个点都要记录路径,需要注意判断下一步的点是否走过。。我没……
DFS绝对可以的说伪代码如下 point q[];保存当前路径 dfs(Point p) { if(p == destination) output(q) else { 对于p四个方向上的每一个点t if(t不在q中) { 将t加入q中 dfs(t) 将t从q中去除 } } }
TGame 2012-11-30
  • 打赏
  • 举报
回复
引用 2 楼 sepcity 的回复:
这个问题。。。BFS(广搜) DFS(深搜)都是可以做的 首先有一个问题。。。你说的不考虑走回头路是指已经走过的点不能再走吧。。 以下讲述就在此基础上 1.深搜的时候,如果搜到目标点,则输出当前路径,返回(即返回到上一个点,继续搜索,即可搜到所有路径) 2.广搜的时候,每个点都要记录路径,需要注意判断下一步的点是否走过。。我没想到太好的判断方法
不考虑回头路是指: 对一条路径,走过的点都不能再走,即一条路径只能往新的点走 两条路径允许交集,允许走过相同点 你给的回答1, 我觉得求不了所有路径,只能求一条相关路径,即前面都一样,最后一二步不一样的几条路径
TGame 2012-11-30
  • 打赏
  • 举报
回复
引用 12 楼 FancyMouse 的回复:
引用 9 楼 taquguodedifang 的回复:引用 7 楼 litaoye 的回复:看错问题了,所说的不能走回头路,我以为是只能朝着2个方向走。 引用 6 楼 FancyMouse 的回复:小纠正。那篇东西只是tech report不是paper 可以往四个方向走,实际问题是可以朝多个(>4)方向走,这里做了简化,在每一步都可以往四个方向走,但不能是当……
嗯 不考虑走环,就是一条路径,走过的点都不能再走 不同路径允许有交集,就是有相同点
FancyMouse 2012-11-29
  • 打赏
  • 举报
回复
引用 9 楼 taquguodedifang 的回复:
引用 7 楼 litaoye 的回复:看错问题了,所说的不能走回头路,我以为是只能朝着2个方向走。 引用 6 楼 FancyMouse 的回复:小纠正。那篇东西只是tech report不是paper 可以往四个方向走,实际问题是可以朝多个(>4)方向走,这里做了简化,在每一步都可以往四个方向走,但不能是当前这条路径来的方向(不能往回走)
只是不能往来的方向走?那只要能走一个环那就有无数种走法了。
shellJ 2012-11-28
  • 打赏
  • 举报
回复
这个应该不用上升到图的概念来理解就可以了,直接利用递归思想就可以了吧,递归入口就是第一个点开始,出口就是判断是否到头,然后中间向左或者向下走就是了吧
TGame 2012-11-28
  • 打赏
  • 举报
回复
引用 1 楼 longburulin 的回复:
就用BFS啊 DFS也行啊
TGame 2012-11-28
  • 打赏
  • 举报
回复
引用 7 楼 litaoye 的回复:
看错问题了,所说的不能走回头路,我以为是只能朝着2个方向走。 引用 6 楼 FancyMouse 的回复:小纠正。那篇东西只是tech report不是paper
可以往四个方向走,实际问题是可以朝多个(>4)方向走,这里做了简化,在每一步都可以往四个方向走,但不能是当前这条路径来的方向(不能往回走)
TGame 2012-11-28
  • 打赏
  • 举报
回复
[quote=引用 7 楼 litaoye 的回复:] 看错问题了,所说的不能走回头路,我以为是只能朝着2个方向走。 可以往四个方向走,实际问题是可以朝多个(>4)方向走,这里做了简化,在每一步都可以往四个方向走,但不能是当前这条路径来的方向(不能往回走)
绿色夹克衫 2012-11-27
  • 打赏
  • 举报
回复
看错问题了,所说的不能走回头路,我以为是只能朝着2个方向走。
引用 6 楼 FancyMouse 的回复:
小纠正。那篇东西只是tech report不是paper
FancyMouse 2012-11-27
  • 打赏
  • 举报
回复
小纠正。那篇东西只是tech report不是paper
FancyMouse 2012-11-27
  • 打赏
  • 举报
回复
引用 3 楼 litaoye 的回复:
走法的话数量可能很多,广搜 + DP可以,记忆化搜索也可以。举个简单的例子,比如40*40的矩阵,左上到右下的走法数量为137846528820,如果用单纯的搜索的话就太慢,用杨辉三角来算就快很多。这个问题也是一样的,需要记录搜索过的点的数量,减少重复的计算。
上下左右都能走而不是只能右下两个方向。答案不是什么简单的组合数。dp什么的在4方向面前就趴了。 然后,我默认“不走回头路”的意思是不走曾经走过的点,也就是说不自交路径。 只是输出所有路径的话那普通的搜索就可以了。这个怎么优化都优化不了。 但如果想要数有多少路径,而且想数得快的话,那得上knuth的ZDD graph counting。它的本质是枚举E的子集,加上状态压缩的技巧。北海道大学今年出过一篇paper把21*21的答案给算出来了。鉴于依然是指数算法,40*40估计几年内是算不出的。
绿色夹克衫 2012-11-26
  • 打赏
  • 举报
回复
不好意思,没有看见罗列出来这个要求,有这个要求的话,数量应该不会太多,直接搜索就可以了。
绿色夹克衫 2012-11-26
  • 打赏
  • 举报
回复
走法的话数量可能很多,广搜 + DP可以,记忆化搜索也可以。举个简单的例子,比如40*40的矩阵,左上到右下的走法数量为137846528820,如果用单纯的搜索的话就太慢,用杨辉三角来算就快很多。这个问题也是一样的,需要记录搜索过的点的数量,减少重复的计算。
sepcity 2012-11-26
  • 打赏
  • 举报
回复
这个问题。。。BFS(广搜) DFS(深搜)都是可以做的 首先有一个问题。。。你说的不考虑走回头路是指已经走过的点不能再走吧。。 以下讲述就在此基础上 1.深搜的时候,如果搜到目标点,则输出当前路径,返回(即返回到上一个点,继续搜索,即可搜到所有路径) 2.广搜的时候,每个点都要记录路径,需要注意判断下一步的点是否走过。。我没想到太好的判断方法
longburulin 2012-11-26
  • 打赏
  • 举报
回复
就用BFS啊 DFS也行啊

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧