【问题标题】:Using recursion to solve mazes in C++?使用递归解决 C++ 中的迷宫?
【发布时间】:2013-04-19 18:37:44
【问题描述】:

我正在尝试创建一个可以通过递归解决迷宫的程序。我的代码基于可以在网上找到的几个步骤,具体来说:

  1. 如果 (x,y 在迷宫外) 返回 false
  2. 如果(x,y 是目标)返回 true
  3. 如果 (x,y 未打开) 返回 false
  4. 将 x,y 标记为解决方案路径的一部分
  5. if (FIND-PATH(North of x,y) == true) 返回 true
  6. if (FIND-PATH(East of x,y) == true) 返回 true
  7. 如果 (FIND-PATH(x,y 以南) == true) 返回 true
  8. if (FIND-PATH(West of x,y) == true) 返回 true
  9. 取消将 x,y 标记为解决方案路径的一部分
  10. 返回假

我已经看到至少有两个关于这个算法的其他问题,但我很确定这些问题并不完全相同。

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.

据我所知,path 方法应该从检查入口正上方的空间开始,该空间位于迷宫外(返回 false)。在此之后,它应该检查东(等等)。但是,当我运行它时,该函数返回 false 并且无法继续执行以下 if 语句。这可以通过打印“end”而没有打印“endtwo”(在北检查后找到)这一事实来证明。我不确定我的递归逻辑或递归实现是否存在某种形式的问题,所以我希望对此进行澄清。

提前致谢!

【问题讨论】:

  • 我不确定,但我觉得这个问题最适合codegolf.stackexchange.com
  • @anakata- 我认为该站点不适合这个问题,因为这些站点通常面向编程难题/问题的最短解决方案,而这是一个编程/调试问题。
  • 网站是cs.bu.edu/teaching/alg/maze。据我了解,该算法会检查迷宫中任何特定点是否有通往出口的路径。
  • 什么是值 val?看起来它已经声明并使用了,但从未初始化过
  • 哦,对不起。 values 只是一个包含几个整数的类。我对使用继承不是很有经验,所以我将维度和起始位置作为公共整数放在“值”中,以避免将许多值传递给路径。

标签: c++ recursion maze


【解决方案1】:

您在bool path(...) 中的第一次检查发现xfalse 并退出,主程序从调用path 得到false 结果,打印他必须做什么并退出。

你应该从一个有效的位置开始你的检查。

【讨论】:

  • 当然这并不意味着算法的其余部分都很好:P 我没有测试它!
  • 这很尴尬。我检查了其他所有内容,但没有意识到我原来的电话是不正确的。我什至不记得为什么我首先在​​那里有-1。非常感谢!
【解决方案2】:

你从一个无效的位置开始,所以不要使用这个if (path(maze, val.startX-1, val.startY)==true) {,试试这个if (path(maze, val.startX, val.startY)==true) {。实际的递归部分对我来说似乎没问题,前提是您不介意用 '.' 替换迷宫中的 'e'

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 2014-12-11
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2019-03-18
    • 2019-02-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多