**已关闭。**此问题需要debugging details。它目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答这个问题。
2天前关闭。
Improve this question的
代码如下。它是一个BFS,我想让它倒退,所以我尝试使用指针在步骤之间建立连接。
sx,sy是我们的起点。tx,ty是我们的命运点。act[][]是一个布尔表,以确保我不会两次进入同一个地方。
struct trip
{
int first;
int second;
trip* last;
};
void write(trip a)
{
cout<<"\n";
cout<< "x" << " " << a.first << "\n";
cout<< "y" << " " << a.second << "\n";
cout<< "x lasta" << " " << a.last->first << "\n";
cout<< "y lasta" << " " << a.last->second << "\n";
}
queue<trip> Q;
trip P; P.first = sx; P.second = sy; P.last = nullptr; Q.push(P);
while(!Q.empty())
{
//cout << "WOW" << "\n";
trip temp = Q.front(); Q.pop();
if(temp.last != nullptr)
write(temp);
int corx = temp.first; int cory = temp.second;
if(corx == tx && cory == ty)
{
// We found our destiny
}
if(act[corx][cory] == false)
{
act[corx][cory] = true;
// Up
if(cory - 1 >= 0)
{
trip TEMPUUS; TEMPUUS.first = corx - 1; TEMPUUS.second = cory; TEMPUUS.last = &temp; Q.push(TEMPUUS);
cout << corx - 1 << " " << TEMPUUS.last -> first; // corx - 1 here is equal to
//TEMPUUS.last -> first - 1 and that is what I want
}
// Down
if(cory + 1 <= 2000)
{
trip TEMPUUS; TEMPUUS.first = corx + 1; TEMPUUS.second = cory; TEMPUUS.last = &temp; Q.push(TEMPUUS);
}
// Left
if(corx - 1 >= 0)
{
trip TEMPUUS; TEMPUUS.first = corx; TEMPUUS.second = cory - 1; TEMPUUS.last = &temp; Q.push(TEMPUUS);
}
// Right
if(corx + 1 <= 2000)
{
trip TEMPUUS; TEMPUUS.first = corx; TEMPUUS.second = cory + 1; TEMPUUS.last = &temp; Q.push(TEMPUUS);
}
}
}
字符串
那有什么问题问题是,当我将一个trip变量推到队列中时,它的坐标与它的前身的坐标不同。然而,当我们进入队列的下一次迭代时,temp
变量超出了作用域,“最后一个”指针现在指向它自己。
的数据
下面是一个代码示例:
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
struct trip
{
int first;
int second;
trip* last;
};
void write(trip a)
{
cout << "\n";
cout << "x" << " " << a.first << "\n";
cout << "y" << " " << a.second << "\n";
cout << "x lasta" << " " << a.last->first << "\n";
cout << "y lasta" << " " << a.last->second << "\n";
}
void bfs(int sx, int sy, int tx, int ty)
{
queue<trip> Q;
trip P; P.first = sx; P.second = sy; P.last = nullptr; Q.push(P);
int test = 0;
while(!Q.empty())
{
trip temp = Q.front(); Q.pop();
if(temp.last != nullptr)
write(temp);
int corx = temp.first;
int cory = temp.second;
if(act[corx][cory] == false)
{
act[corx][cory] = true;
// Up
if(cory - 1 >= 0)
{
trip TEMPUUS; TEMPUUS.first = corx - 1; TEMPUUS.second = cory; TEMPUUS.last = &temp; Q.push(TEMPUUS);
cout << corx - 1 << " " << TEMPUUS.last -> first;
}
}
test++;
if(test > 5)
return;
}
}
int main()
{
int sx, sy, tx, ty;
cin >> sx >> sy >> tx >> ty;
sx += 1000; sy += 1000; tx += 1000; ty += 1000;
bfs(sx, sy, tx, ty);
return 0;
}
型
1条答案
按热度按时间zu0ti5jz1#
temp
结构在堆栈上分配,当定义它的块退出时,该内存再次被释放。这意味着排队的trip
现在有一个无效的last
引用。相同的内存在循环的下一次迭代中被重用,使上面提到的
last
引用再次有效。但是现在对temp.first
的赋值会影响 * 那个 * 内存。简而言之,所有非空的last
成员引用 * 相同的 * 内存位置。要解决这个问题,可以使用堆分配的内存(使用
new
、class
等)。您还应该注意释放已使用的内存。在您的例子中,与
last
的链接形成了一个树,这可能是一个相当大的负担。我建议将内存管理留给shared smart pointers。不是你的问题,而是:
if
条件指示“向上”移动时,您使用减小的x坐标而不是减小的y坐标来创建Trip
。using namespace std;
is considered bad practice的下面是
struct trip
和write
函数的替代:字符串
现在你的
bfs
函数看起来像这样:型