- 已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含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。我不知道这是什么原因,但我已经尝试将所有内容放在任何地方。
1条答案
按热度按时间h5qlskok1#
isValid
函数是不正确的。它的 first 工作必须是检查v
和k
是否在正确的范围内。现在,你要做的第一件事是测试a[v][k]
。但是如果任何一个索引超出范围,你的程序的行为是未定义的。还有一个问题是你的测试是向后的。
a
是由v
索引的,所以v
必须小于a.size()
* 而不是 *a[0].size()
。同样的,对于k
,它索引a[v]
。你只是把它们混在一起了。让我们修正函数的参数,不需要通过引用传递索引,而且因为
a
和b
没有被这个函数修改,所以它们应该是常量。也可以去掉
if
,只返回一个布尔值。