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

时间:2013-04-19 18:37:45

标签: c++ recursion maze

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

  1. if(x,y outside maze)返回false
  2. if(x,y is goal)return true
  3. if(x,y not open)return false
  4. 标记x,y作为解决方案路径的一部分
  5. if(FIND-PATH(x,y之前)== true)返回true
  6. if(FIND-PATH(东,x,y)== true)return true
  7. if(FIND-PATH(x,y以南)== true)返回true
  8. if(FIND-PATH(西部x,y)== true)返回true
  9. 取消标记x,y作为解决方案路径的一部分
  10. return false
  11. 我已经看到这个算法至少还有两个问题,但我很确定问题并不完全相同。

    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 个答案:

答案 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'替换迷宫中的'.'