当前位置: 首页 > 知识库问答 >
问题:

使用递归解决C中的迷宫?

杨利
2023-03-14

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

  1. if(x, y在迷宫外)返回false
  2. if(x, y是目标)返回true
  3. if(x, y not open)返回false
  4. 将x, y标记为解路径的一部分
  5. if(FIND-PATH(x, y的北方)==true)返回true
  6. if(FIND-PATH(East of x, y)==true)返回true
  7. if(FIND-PATH(x, y以南)==true)返回true
  8. if(FIND-PATH(West of x, y)==true)返回true
  9. 将x, y标记为解路径的一部分
  10. 返回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)。接下来,它应该检查east(以此类推)。但是,当我运行它时,函数返回false,并且无法继续执行以下if语句。这一点可以通过打印“end”而不是“endtwo”(在north check之后找到)这一事实来证明。我不确定我的递归逻辑或我的递归实现是否存在某种形式的问题,所以我希望对此有一些澄清。

提前谢谢!

共有2个答案

卞安邦
2023-03-14

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

柴意智
2023-03-14

您的第一次签入bool路径(…) 查找x

你应该从一个有效的位置开始你的支票。

 类似资料:
  • 所以,我有一个作业,要求我用递归解一个迷宫。我会把作业指导贴出来,这样你就能明白我在说什么了。教授没怎么解释递归,他给了我们一些递归的例子,我会发布这些例子,但我希望有人能给我一个更深入的递归解释,以及我如何将其应用于解决迷宫。我不是要求任何人编写代码,我只是希望一些解释能让我走上正确的道路。感谢所有回答的人。 以下是我的例子: 以下是指南: 你要创建一个迷宫爬虫能够解决任何迷宫你给它递归的力量!

  • 我得到了一些构建迷宫的代码,以及任何其他需要的东西,抽象迷宫类包含一个抽象方法“makeMove(int row,int col)”。这是我试图编写的解决迷宫的方法,向左、向右、向上、向下移动。 我刚刚开始做这件事,下面是我到目前为止的全部资料。 好的,我让代码运行到不再出现错误的地方。 感谢所有的帮助。

  • 我正在尝试寻找到EndPotion的路径。这是一个递归函数。请帮助,我要自杀了。 这是给定的地图 我想递归地使用GetPath来到达上面地图中的EndPotion。参数是当前位置、结束位置和地图。对于这个例子,起始位置是(0,0)和结束,EndPotionis是(0,3),右上角。0代表墙壁,1代表路径。 我需要返回一个包含有效点的arraylist到结束位置。虽然我的数组大小始终为0,并且基本大

  • 我的任务是用回溯和递归的方法解决一个迷宫。这更多的是一个关于这个概念的概念问题。 回溯电话是如何接通的?从我所看到的所有示例来看,似乎递归总是在回溯步骤之前立即调用,所以回溯是无法实现的。谁能给我解释一下回溯步骤是怎么达到的?

  • 嗨~我被这个问题困住了。有人请帮帮我!!!! 问题是程序会要求用户输入一个4到20之间的数字来决定迷宫的大小。它稍后会要求用户逐行输入迷宫的内容并将其存储到2D bool数组中(true表示阻塞,false表示清除)。然后程序从左上角开始,并尝试找到一条通往右下角的路径(可以向右、向左、向上、向下移动)。此时,程序还应该维护另一个char数组,该数组记录找到的路径(如果有的话)并在处理结束时打印出

  • 我在用递归解迷宫。我的矩阵是这样的 这是更大矩阵的原型。我的求解递归方法如下所示 你们可以注意到,这里我返回一个布尔值,如果我找到一条路径,它应该会给我一个真值。但它总是给我错误的答案。我不确定我在递归方法中犯的逻辑错误。方法如下 endX=3;endY=10;