c++ - 解决二维数组中的迷宫

标签 c++ c algorithm

我引用了许多文章和问题来回答如何有效地解决迷宫问题,但在这里我想确认我的代码中出了什么问题。考虑迷宫:

2 1 0 0 3
0 1 0 1 1
0 1 0 0 1
0 1 1 0 0
0 0 0 0 0

其中 1 代表墙壁,0 代表路径。(源为 2,目标为 3)。 有没有路径都要输出。

int y=0;
        while(y==0)
        {
            robo1(n,m,maze);//this function adds 2 to any '0'/'3' in (i,j+1),(i+1,j),(i-1,j),(i,j-1) (if exists),where (i,j) is 2
            robo2(n,m,k2,maze);//this function adds 3 to any '0'/'2' in (i,j+1),(i+1,j),(i-1,j),(i,j-1) (if exists), where (i,j) is 3
            if(find5(n,m,maze)==1)//this function returns 1 if there is '5' in the maze
                y++;
            if(find0(n,m,maze)==0)//this function returns 0 if there are no '0' in the maze
                break;
        }
        if(find0(n,m,maze)==0 && y==0)
            printf("-1\n");//no path
        else
            printf("1\n");//there is a path

我的想法是,如果在迷宫中找到任意数量的循环后出现 5,则表示存在路径。 但是在代码中实现这个功能时,我得到了错误的答案,有时还会出现运行时错误。 以上逻辑有没有漏洞?

最佳答案

总体思路应该差不多可行,但当然一切都在细节中。

然而,即使正确实现,您的方法也不会奏效的一种情况是:

  2 1 0 0 0
  1 1 0 1 1 
  0 0 0 1 3

即如果 2 和 3 都被墙“封闭”但房间里有 0。你的循环永远不会结束,因为尽管两个 robo 函数周围都有 0,但都不会改变任何东西。

一个简单的解决方案是,如果机器人实际上至少更改了矩阵中的一个值,则从机器人返回 0/1,并在这种情况没有发生时退出。

请注意,这不是解决迷宫的非常有效的方法(您的代码将多次检查相同的单元格)。

关于c++ - 解决二维数组中的迷宫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38217674/

相关文章:

c++ - 为什么我的 Qt 文件对话框的原生性取决于环境变量?

c++ - 概念正则与概念半正则

c++ - C++如何将char *精确地转换为double?

c - 将内核中的两个预定义值相乘

string - 为什么多个字符串的最长公共(public)子序列是 NP-Hard?

java - 根据合并标准有效地合并列表

相关项目分组算法

c++在第一类的构造函数中创建第二类的对象 - 多线程

c - 使用 OpenMP 优化循环后没有性能提升

c - 从函数传递字符串