在查找两个给定单元格的所有路径时避免无限循环中的深度优先搜索 (DFS)
Avoid Depth First Search (DFS) from infinite loop at finding all path of two giving cell
有一个二维数组,我要找到从 Begin-cell 到 Goal-cell 的所有路径(不管 shortest/longest)。
并且在数组(图形)上使用了 DFS 解决方案并将探索单元格(节点)。
类似c#的伪代码:
//setin A and B
setAB(beginNode,goalNode);
//collect info from where we was to explore other sub path
//first seen:
visited.add(beginNode);
//wholegrid as a matrix and visited for memory
Search(wholeGrid,visited){
neighborsNodes =getNeighbors(visited.last);
//check in neighbors condition first
foreach(node in neighborsNodes ){
if(visited.contains(node)){continue};
if(node==goalNode)){
visited.add(node);
saveOrShowPath();
visited.remove(node);
break;
}
}
//recursive call here
foreach(node in neighborsNodes ){
if(visited.contains(node)||node==goalNode){continue;};
visited.add(node);
Search(wholeGrid,visited);
visited.remove(node);
}
}
}
问题的兴起:
对于将落入循环中的任何随机 start/goal 节点!
初始代码是为图形而不是网格编写的。
如果问题与此有关,如何解决:
http://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search
或者如果解决方案本身是错误的,请告诉我。
-提前致谢。
一切都需要结束。最简单的递归:
calc(factorial)
{
if (factorial == 0)
return 1;
else
return calc(factorial - 1) * factorial;
}
有一个二维数组,我要找到从 Begin-cell 到 Goal-cell 的所有路径(不管 shortest/longest)。 并且在数组(图形)上使用了 DFS 解决方案并将探索单元格(节点)。
类似c#的伪代码:
//setin A and B
setAB(beginNode,goalNode);
//collect info from where we was to explore other sub path
//first seen:
visited.add(beginNode);
//wholegrid as a matrix and visited for memory
Search(wholeGrid,visited){
neighborsNodes =getNeighbors(visited.last);
//check in neighbors condition first
foreach(node in neighborsNodes ){
if(visited.contains(node)){continue};
if(node==goalNode)){
visited.add(node);
saveOrShowPath();
visited.remove(node);
break;
}
}
//recursive call here
foreach(node in neighborsNodes ){
if(visited.contains(node)||node==goalNode){continue;};
visited.add(node);
Search(wholeGrid,visited);
visited.remove(node);
}
}
}
问题的兴起: 对于将落入循环中的任何随机 start/goal 节点!
初始代码是为图形而不是网格编写的。 如果问题与此有关,如何解决: http://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search 或者如果解决方案本身是错误的,请告诉我。 -提前致谢。
一切都需要结束。最简单的递归:
calc(factorial)
{
if (factorial == 0)
return 1;
else
return calc(factorial - 1) * factorial;
}