【问题标题】:Stuck in a maze loop陷入迷宫循环
【发布时间】:2016-08-16 01:31:49
【问题描述】:

问题

我是这种编程的新手,我的 C++ 迷宫求解器陷入了循环。

迷宫是一个简单的 char 二维矩阵,星号 (*) 表示有效路径方块,斜线 (/) 表示墙壁方块。

为什么程序找到'/'时不停止?

# include < iostream >

using namespace std;


char lab[6][6] =
{ { '/','/','/','/','/' },
{ '/','*','/','/','/' },
{ '/','*','*','*','/' },
{ '/','/','*','/','/' },
{ '/','/','*','/','/' },
{ '/','/','*','*','*' } };

int x, y;

void run(char lab[][6], int, int);

bool movU() // Move Up
{
if (lab[x][y - 1] == '*')
    return true;
else
    return false;
}

bool movR() // Move right
{
if (lab[x + 1][y] == '*')
    return true;
else
    return false;
}

bool movD() // Move Down
 {
if (lab[x][y + 1] == '*')
    return true;
else
    return false;
}

bool movL() // Move Left
{
if (lab[x - 1][y] == '*')
    return true;
else
    return false;
}

void run(char lab[][6], int x, int y)
{

if (movU() == true) // I'm getting stuck right here
    run(lab, x, y - 1); // Getting negative numbers here
else if (movR() == true)
    run(lab, x + 1, y);
else if (movD() == true)
    run(lab, x, y + 1);
else if (movL() == true)
    run(lab, x - 1, y);
else
    cout << "Error" << endl;

}

int main()
{
x = 1, y = 2; // Start position

run(lab, x, y);

return 0;

}

【问题讨论】:

  • movU() 使用全局 xy(均未初始化)。将movU() 更改为movU(int x, int y) 等,然后在run 中执行if (movU(x, y) == true)
  • 谢谢!现在可以了,我没想过要这样做,我需要多加注意

标签: c++ recursion infinite-loop


【解决方案1】:

除了 x 和 y 的全局范围问题之外,您还没有采取任何措施来防止下标越过迷宫边缘进入随机内存位置。结果,y 继续递减,您通过内存查找星号。由于您也会重复,因此您将继续此操作,直到耗尽所有堆栈空间。

此外,您似乎还不习惯布尔值:您需要做很多额外的工作来处理常量 truefalse,而不是简单地处理使用布尔表达式的值。

我已在您的代码中修复了这些项目:

# include <iostream>

using namespace std;


char lab[6][6] =
{ 
  { '/','/','/','/','/' },
  { '/','*','/','/','/' },
  { '/','*','*','*','/' },
  { '/','/','*','/','/' },
  { '/','/','*','/','/' },
  { '/','/','*','*','*' } 
};

void run(char lab[][6], int, int);

bool movU(int x, int y) // Move Up
{
    return x >= 0 && y >= 1 &&
           x < 6  && y <  6 &&
           lab[x][y - 1] == '*';
}

bool movR(int x, int y) // Move right
{
    return x >= 0 && y >= 0 &&
           x < 5  && y <  6 &&
           lab[x+1][y] == '*';
}

bool movD(int x, int y) // Move Down
{
    return x >= 0 && y >= 0 &&
           x < 6  && y <  5 &&
           lab[x][y + 1] == '*';
}

bool movL(int x, int y) // Move Left
{
    return x >= 1 && y >= 0 &&
           x < 6  && y <  6 &&
           lab[x-1][y] == '*';
}

void run(char lab[][6], int x, int y)
{
    cout << "ENTER run; x = " << x << "\ty = " << y << endl;

    if (movU(x, y)) // I'm getting stuck right here
        run(lab, x, y - 1); // Getting negative numbers here
    else if (movR(x, y))
        run(lab, x + 1, y);
    else if (movD(x, y))
        run(lab, x, y + 1); 
    else if (movL(x, y))
        run(lab, x - 1, y);
    else
        cout << "Error" << endl;
}

int main()
{
    // x = 1, y = 2; // Start position
    run(lab, 1, 2);
    return 0;
}

这将保持在边界内......并循环直到用完堆栈空间。您需要添加代码以避免重新检查您已经访问过的地面。例如,您可以使用下划线等其他字符来标记位置。

您还需要识别何时完成。迷宫出口的标志是什么?为此,您需要检查您的 run 例程。

【讨论】:

  • 谢谢,我确实不完全理解布尔函数的正确使用,但是谢谢,现在我对这一切有了更多的了解,迈出了一大步:D
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多