我正在尝试创建一个可以通过递归来解决迷宫的程序。我的代码基于可以在网上找到的几个步骤,具体来说:
我已经看到这个算法至少还有两个问题,但我很确定问题并不完全相同。
bool path (string maze[], int x, int y){
values val;
bool check;
//for (int k=0; k<val.xDim; k++) cout<<maze[k]<<endl;
cout<<x<<":"<<y<<endl;
if (x>val.xDim || y>val.yDim || x<0 || y<0) {cout<<"end\n"; return false; }
if (maze[x][y]=='x') return true; //If exit is reached
if (maze[x][y]=='%' || maze[x][y]=='+') return false; //If space is filled
maze[x][y]='+';
if (path(maze, x-1, y)==true) return true;
cout<<"endtwo\n";
if (check=path(maze, x, y+1)==true) return true;
if (path(maze, x+1, y)==true) return true;
if (path(maze, x, y-1)==true) return true;
maze[x][y]='.';
return false;
}
int main(){
if (path(maze, val.startX-1, val.startY)==true) {
for (int k=0; k<val.xDim; k++) cout<<maze[k]<<endl;
} else cout<<"No solution found.\n";
}
样本迷宫是(其中e是入口,x是出口):
%e%%%%%%%%%
%...%.%...%
%.%.%.%.%%%
%.%.......%
%.%%%%.%%.%
%.%.....%.%
%%%%%%%%%x%
输出:
-1:1
end
No solution found.
从我所知道的,路径方法应首先检查入口正上方的空间,该空间位于迷宫之外(返回false)。在此之后,它应该检查东(等等)。但是,当我运行它时,该函数返回false并且无法继续执行以下if语句。打印“end”的事实表明了这一点,而“endtwo”(在北检查后发现)则没有。我不确定我的递归逻辑或递归实现是否存在某种形式的问题,所以我希望对此有所澄清。
提前致谢!
答案 0 :(得分:4)
您的第一次检入bool path(...)
发现x&lt; 0,因为x == - 1,所以函数返回false
并退出,主程序从调用中获得false
结果到path
,打印他所拥有和退出的内容。
您应该使用有效职位开始支票。
答案 1 :(得分:0)
您是从一个无效的位置开始的,所以不要使用此if (path(maze, val.startX-1, val.startY)==true) {
,请尝试此if (path(maze, val.startX, val.startY)==true) {
。实际递归部分对我来说似乎没问题,只要您不介意用'e'
替换迷宫中的'.'
。