使用递归C ++解决迷宫问题

时间:2016-03-16 12:48:49

标签: c++ recursion solver maze

我正在尝试阅读迷宫(来自input.txt)并解决它。此代码无法正常工作。有什么问题?

void Maze::create(vector<vector<int> >&info)
{
for (int i = 1; (unsigned)i < info.size(); i++)
{
    for (int j = 0; (unsigned)j < info[i].size(); j++)
    {
        if (info[i][j] == wall)
        {
            map[i - 1][j] = block;
        }
        else if (info[i][j] == path)
        {
            map[i - 1][j] == '  ';
        }
        else if (info[i][j] == start)
        {
            map[i - 1][j] = 'S';
            startingX = (i - 1);
            startingY = j;
        }
        else if (info[i][j] == end)
        {
            map[i - 1][j] = 'E';
            endingX = (i - 1);
            endingY = j;
        }
        else if (info[i][j]>=bonus)
        {
            map[i - 1][j] = 'B';
        }
    }
}
print();
cout << endl;
if (solve(startingX, startingY))
{
    print();
}
else
{
    cout << "DAMN" << endl;
}

}

以上是我读取名为&#34; info&#34;的输入文件的功能。并转换为名为&#34; map&#34;。

的迷宫
bool Maze::solve(int a, int b)
{

    map[b][a] = road;
    cout << "yes"<<endl;
    if (a == endingX&&b == endingY)
    {
        cout << "yes1" << endl;
        return true;
    }
    else if (a > 0 && map[b][a - 1] ==free && solve((a - 1), b))
    {
        cout << "yes2" << endl;
        return true;
    }
    else if (a < map[0].size() && map[b][a + 1] == free&& solve((a + 1), b))
    {
        cout << "yes3" << endl;
        return true;
    }
    else if (b > 0 && map[b - 1][a] == free && solve(a, (b - 1)))
    {
        cout << "yes4" << endl;
        return true;
    }
    else if (b < map.size() && map[b + 1][a] == free && solve(a, (b + 1)))
    {
        cout << "yes5" << endl;
        return true;
    }
    map[b][a] == free;
    //print();
    return false;
}

那是我的解决代码。我尝试使用递归方法,但似乎它不起作用,但只是向我展示了起点。

2 个答案:

答案 0 :(得分:4)

1)注意不要混淆分配和检查平等:

    您在创建函数中的
  • ,第二个选项:map[i - 1][j] == ' ';
  • 在你的求解函数中,在底部:map[b][a] == free;

因此,map中没有保存任何数据。相等测试只返回false并丢弃该布尔值。

2)此外,我没有看到mapstartingX等的任何声明/初始化。但由于你没有提到编译错误,我想你只是没有复制它们所以。

总之,我打赌你的问题是由第一个问题引起的。

答案 1 :(得分:2)

1)您使用X值作为Maze::create()中的第一个坐标并调用Maze::solve(),但作为Maze::solve()的第二个坐标

2)当你在Maze::solve()if (a < map[0].size() && map[b][a + 1] == free&& solve((a + 1), b))写作时,你可以在a+1写下a+1 == map[0].size(); a+1必须小于