陷入迷宫 问题 我对这种编程很陌生,我的C++迷宫求解器被困在一个循环中。

陷入迷宫 问题 我对这种编程很陌生,我的C++迷宫求解器被困在一个循环中。,c++,recursion,infinite-loop,C++,Recursion,Infinite Loop,迷宫是一个简单的字符二维矩阵,其中星号(*)表示有效路径正方形,斜线(/)表示墙正方形 为什么程序在找到“/”时不停止 # include < iostream > using namespace std; char lab[6][6] = { { '/','/','/','/','/' }, { '/','*','/','/','/' }, { '/','*','*','*','/' }, { '/','/','*','/','/' }, { '/','/','*','/',

迷宫是一个简单的字符二维矩阵,其中星号(*)表示有效路径正方形,斜线(/)表示墙正方形

为什么程序在找到“/”时不停止

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

}
#包括
使用名称空间std;
字符实验室[6][6]=
{ { '/','/','/','/','/' },
{ '/','*','/','/','/' },
{ '/','*','*','*','/' },
{ '/','/','*','/','/' },
{ '/','/','*','/','/' },
{ '/','/','*','*','*' } };
int x,y;
无效运行(字符实验室[][6],int,int);
bool movU()//向上移动
{
如果(lab[x][y-1]='*')
返回true;
其他的
返回false;
}
bool movR()//向右移动
{
如果(实验室[x+1][y]='*')
返回true;
其他的
返回false;
}
bool movD()//向下移动
{
如果(lab[x][y+1]='*')
返回true;
其他的
返回false;
}
bool movL()//向左移动
{
如果(lab[x-1][y]='*')
返回true;
其他的
返回false;
}
无效运行(字符实验室[][6],整数x,整数y)
{
如果(movU()==true)//我被困在这里了
运行(lab,x,y-1);//在这里得到负数
else if(movR()==true)
运行(实验室,x+1,y);
else if(movD()==true)
运行(实验室,x,y+1);
else if(movL()==true)
运行(实验室,x-1,y);
其他的

cout除了x和y的全局作用域问题外,您还没有做任何事情来防止下标从迷宫的边缘进入随机内存位置。因此,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;
}
#包括
使用名称空间std;
字符实验室[6][6]=
{ 
{ '/','/','/','/','/' },
{ '/','*','/','/','/' },
{ '/','*','*','*','/' },
{ '/','/','*','/','/' },
{ '/','/','*','/','/' },
{ '/','/','*','*','*' } 
};
无效运行(字符实验室[][6],int,int);
boolmovu(intx,inty)//向上移动
{
返回x>=0&&y>=1&&
x<6和y<6&&
lab[x][y-1]=='*';
}
boolmovr(intx,inty)//向右移动
{
返回x>=0&&y>=0&&
x<5和y<6&&
实验室[x+1][y]='*';
}
boolmovd(intx,inty)//向下移动
{
返回x>=0&&y>=0&&
x<6和y<5&&
实验室[x][y+1]=='*';
}
boolmovl(intx,inty)//向左移动
{
返回x>=1&&y>=0&&
x<6和y<6&&
实验室[x-1][y]='*';
}
无效运行(字符实验室[][6],整数x,整数y)
{

cout
movU()
使用全局
x
y
(均未初始化)。将
movU()
更改为
movU(int x,int y)
等,然后在
中运行
do
if(movU(x,y)==true)
,etcThanks!现在它可以工作了,我没有想过要这么做,我需要更多地关注这一点。谢谢,我确实没有完全理解布尔函数的正确用法,但是谢谢,现在我对这一切有了更多的了解,这是一个很大的进步:D