c++ 走出迷宫使用堆栈实现DFS [已关闭]

ivqmmu1c  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(109)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
3天前关闭。
Improve this question

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
bool isValid(int &v, int &k, vector<vector<bool> > &a, vector<vector<bool> > &b)
{
    if(a[v][k] || k < 0 || v < 0 || k > a.size()-1 || v > a[0].size()-1 || b[v][k]) 
        return false;
    else 
        return true;    
}  
int main()
{
    cin.tie(NULL);
    int n,m;
    cin >> n >> m;
    vector<vector<bool > > prepreke(n, vector<bool> (m));
    vector<vector<bool> > posecenost(n, vector<bool> (m));
    stack<pair<int,int> > s;
    int v,k;
    cin >> v >> k;
    int x,y;
    cin >> x>> y;
    int a;
    cin >> a;
    for(int i = 0; i < a; i++)
    {
        int z,zz;
        cin >> z >> zz;
        prepreke[z][zz] = true;
    }
    s.push(make_pair(v,k));
    int pravac[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
    while(!s.empty())
    {
        posecenost[v][k] = true;
        pair<int, int> p = s.top();
        
        if(p.first == x && p.second == y) {
            cout << "YES\n"; break; 
        }
        s.pop();
        
        for(int i = 0; i < 4; i++)
        {
            int vv = v; int kk = k;
            v += pravac[i][0];
            k += pravac[i][1];
            if(isValid(v,k,posecenost,prepreke))
            {
                s.push(make_pair(v,k));
                break;
            }
            v = vv;
            k = kk;
        }
    }
    if(s.empty()) cout << "NO\n";
    return 0;   
}

输入:首先我们输入矩阵的大小(NxM)。然后我们加上起点,和我们想要去的点(终点)。之后我们输入我们想要的障碍物的数量(当我们int〉0时,我们输入它们的x和y坐标)。
正如我解释的那样,接下来的步骤很简单,我们将起点添加到堆栈中,然后检查它是否是终点,如果不是,弹出它,然后我们尝试找到4条路径中没有被阻塞/访问/跳出矩阵的一条。
问题是,我的程序进入了一个FOR循环,发现我们可以向右并返回值3221225477。我不知道这是什么原因,但我已经尝试将所有内容放在任何地方。

h5qlskok

h5qlskok1#

isValid函数是不正确的。它的 first 工作必须是检查vk是否在正确的范围内。现在,你要做的第一件事是测试a[v][k]。但是如果任何一个索引超出范围,你的程序的行为是未定义的。
还有一个问题是你的测试是向后的。a是由v索引的,所以v必须小于a.size() * 而不是 * a[0].size()。同样的,对于k,它索引a[v]。你只是把它们混在一起了。
让我们修正函数的参数,不需要通过引用传递索引,而且因为ab没有被这个函数修改,所以它们应该是常量。
也可以去掉if,只返回一个布尔值。

// Note: a and b must have the same number of rows and columns
bool isValid(int v, int k, const vector<vector<bool>>& a, const vector<vector<bool>>& b)
{
    return v >= 0 && v < a.size()
        && k >= 0 && k < a[0].size()
        && !a[v][k]
        && !b[v][k];
}

相关问题