追踪迷宫,从源头到达目标
Trace the maze to reach from source to goal
我正在尝试实现一个问题的解决方案,其中我需要在迷宫中递归地找到从源到目标的路径。
假设这是迷宫:
S X X X X X
. . . . . X
X . X X X X
X . X X X X
. . . X . G
X X . . . X
其中
X阻塞路径
.-开放路径
S-启动
G-目标
我已经编写了以下代码来实现该解决方案,但它给了我一个分段错误。如果有人能告诉我哪里做错了,我会很高兴。
我的解决方案是
#include<iostream>
using namespace std;
void printGrid(char grid[6][6])
{
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
cout<<grid[i][j]<<" ";
}
cout<<"n";
}
}
bool isValidPoint(char grid[6][6],int x,int y)
{
if(x<0 || x>5 || y<0 || y>5)
{
return false;
}
if(grid[x][y]=='X')
{
return false;
}
return true;
}
bool traceMaze(char grid[6][6],int x,int y)
{
if(!isValidPoint(grid,x,y))
{
return false;
}
if(grid[x][y]=='G')
{
return true;
}
grid[x][y] = '+';
if(traceMaze(grid,x-1,y)){return true;}
if(traceMaze(grid,x,y+1)){return true;}
if(traceMaze(grid,x+1,y)){return true;}
if(traceMaze(grid,x,y-1)){return true;}
grid[x][y] = '.';
return false;
}
int main()
{
char grid[6][6] = {{'S','X','X','X','X','X'},{'.','.','.','.','.','X'},{'X','.','X','X','X','X'},{'X','.','X','X','X','X'},{'.','.','.','X','.','G'},{'X','X','.','.','.','X'}};
cout<<"Initial grid is as follows :n";
printGrid(grid);
cout<<"nStarting at : (0,0)nTracing the path to the Goaln";
cout<<traceMaze(grid,0,0)<<"n";
cout<<"nFinal grid is as follows :n";
printGrid(grid);
return 0;
}
附言:我假设迷宫的大小是6X6…
Correct Solution :
我没有检查我正在通过的"+",以查看最终追踪的路径。
所以现在我在那里应用了一个检查,isValidPoint
函数转换为:
bool isValidPoint(char grid[6][6],int x,int y)
{
if(x<0 || x>5 || y<0 || y>5)
{
return false;
}
if(grid[x][y]=='X' || grid[x][y]=='+')
{
return false;
}
return true;
}
谢谢你们的帮助伙计们:)
我去年在一次全职面试中得到了这个问题。
最简单的解决方法是不将带有"+"的和点视为要进入的有效点(因为您已经在这条路径中找到了)。
黑暗的答案在我看来是有效的。
您的搜索从0,0开始。然后它回到0,1,从那里它回到0,0,再回到0,1…你应该标记你已经访问过的方块,不要再去那里了。'+'很好,但设置后不应该清除它,应该在isValidPoint中检查它。
您正在做的是深度优先遍历迷宫。您正在将.
更改为+
以跟踪访问的点,但完成后将它们再次更改为.
。这就是问题所在。
假设A
和B
是迷宫的相邻细胞。当您遍历A
时,将A
更改为+
并递归遍历其邻居(包括B
),然后再次将A
更改为.
。然后,当您遍历B
时,A
是.
,所以您从B
再次遍历A
,这是不必要的。
这就是为什么递归永远不会结束,并且会出现分段错误。
解决这个问题的一种方法是保留一个单独的6x6阵列来跟踪访问的点。当你处理完一个单元格(即遍历该单元格的所有可能路径)后,将其标记为"已访问"单元格,并且永远不要再访问已访问的单元格。
我把你的迷宫写在一张纸上,用手尝试算法,结果在x=2,y=1处卡住了,你的算法想回到x=1,y=1,回到以前的状态。这种状态当然会进入上述状态,并产生一个无限循环。递归编程的一个重要规则是始终确保所有函数调用的所有执行路径都以返回调用(或类似的)结束
如果你想在这个问题上大做文章,我建议你研究一下最短路径问题的解决方法,例如Dijkstra的算法。
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++A*算法并不总是在路径中具有目标节点
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 为测试目标创建具有不同源文件夹的文件
- 使用源向量作为目标
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 在 CMake 中为每个目标设置编译器/链接器标志
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 CMake 中对目标依赖项进行分组?
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何为包含头文件的目标编写生成文件?
- 线性优化目标函数中的绝对值
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 字符串函数在目标C++上运行时C++返回空
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 请求最简单的 OpenMP 目标 GPU 示例
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 追踪迷宫,从源头到达目标
- 如何从g++生成的目标代码中去掉表示源头文件的绝对路径的字符串