我正在尝试创建一个可以通过递归解决迷宫的程序 . 我的代码基于可以在网上找到的几个步骤,具体来说:
-
if(x,y外迷宫)返回false
-
if(x,y是goal)返回true
-
if(x,y not open)返回false
-
标记x,y作为解决方案路径的一部分
-
if(FIND-PATH(x,y之前)== true)返回true
-
if(FIND-PATH(东经x,y)== true)返回true
-
if(FIND-PATH(x,y之后)== true)返回true
-
if(FIND-PATH(西x,y)== true)返回true
-
unmark x,y作为解决方案路径的一部分
-
返回false
我已经看到这个算法至少有两个问题,但我很确定问题并不完全相同 .
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”(在北检查后发现)则没有 . 我不确定我的递归逻辑或递归实现是否存在某种形式的问题,所以我希望对此有所澄清 .
提前致谢!
2 回答
你在
bool path(...)
中的第一次检查发现x <0,因为x == - 1,所以函数返回false
并退出,主程序从path
调用获得false
结果,打印出他已经输出和退出的内容 .你应该用有效的职位开始你的支票 .
你是从一个无效的位置开始的,所以不要这个
if (path(maze, val.startX-1, val.startY)==true) {
,试试这个if (path(maze, val.startX, val.startY)==true) {
. 实际的递归部分对我来说似乎没问题,前提是你不介意用'.'
从迷宫中替换'e'
.