陷入迷宫循环

时间:2016-08-16 01:31:50

标签: c++ recursion infinite-loop

问题

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

迷宫是一个简单的char 2-D矩阵,有效路径方形用星号(*),墙方块用斜杠(/)。

为什么程序在找到' /'?

后停止运行?
# 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;

}

1 个答案:

答案 0 :(得分:1)

除了x和y的全局范围问题之外,你还没有做任何事情来保持下标在迷宫的边缘上运行到随机存储器位置。结果, y 继续递减,您通过内存备份寻找星号。既然你又复发了,你继续这样做,直到你把所有的堆栈空间都吹掉。

另外,你似乎对布尔值感到满意:你做了很多额外的工作来处理常量 true false ,而不是而不是简单地使用布尔表达式的值。

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

# 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;
}

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

您还需要确认自己何时完成。什么标志着迷宫的出口?您需要检查运行例程。