- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为一个迷宫创建一个 BFS,该迷宫将在到达某个点时停止。在测试它时,我遇到了段错误(核心转储)错误。我正在尝试修改我在此 site 上找到的代码.我正在尝试做的事情与该站点中的代码之间的主要区别是我不需要输出行进的距离,而且我还应该输出队列中的顺序,顶点位于矩阵的内部。例如,输出应如下所示:
What the output of the program should be
哈希表示没有添加到队列中的顶点,由于这个错误阻止我继续前进,我现在不太关心它们。
到目前为止,这是我的代码:
#include <queue>
#include <iostream>
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define ROW 8
#define COL 11
struct Point{
int x;
int y;
};
bool isValid(int x, int y)
{
// return true if row number and column number
// is in range
return (x >= 0) && (x< ROW) &&
(y >= 0) && (y < COL);
}
int rowNum[] = {-1, 0, 0, 1};
int colNum[] = {0, -1, 1, 0};
int BFS(int mat[][COL], Point src, Point dest)
{
int order = 1;
// Mark the source cell as visited
bool visited[ROW][COL];
memset(visited, false, sizeof visited);
visited[src.x][src.y] = true;
// Create a queue for BFS
queue <Point> vertices;
// Enqueue source cell
vertices.push(src);
// Do a BFS starting from source cell
while(visited[dest.x][dest.y] != true){
Point current = vertices.front();
vertices.pop();
for (int i = 0; i < 4; i++)
{
int row = current.x + rowNum[i];
int col = current.y + colNum[i];
// if adjacent cell is valid, has path and
// not visited yet, enqueue it.
if (isValid(row, col) == true && (mat[row][col]) &&
!visited[row][col])
{
cout << "Hi" << endl;
// mark cell as visited and enqueue it
visited[row][col] = true;
mat[row][col] = order;
order++;
vertices.push(current);
cout << vertices.front().x;
cout << vertices.front().y;
}
else {
}
}
}
return -1;
}
int main()
{
int mat[ROW][COL] =
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
Point source = {0, 0};
Point dest = {3, 4};
BFS(mat, source, dest);
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
std::cout << mat[i][j] << ' ';
}
std::cout << std::endl;
}
return 0;
}
我事先做了一些故障排除,发现错误很可能是由这里的这个地方引起的:
if (isValid(row, col) == true && (mat[row][col]) &&
!visited[row][col])
{
// mark cell as visited and enqueue it
visited[row][col] = true;
mat[row][col] = order;
order++;
vertices.push(current);
cout << vertices.front().x;
cout << vertices.front().y;
}
我假设因为我设置了一堆输出消息(您可能会注意到 cout“Hi's”)出现在原因的某些点以找到错误的来源,这就是它引导我的地方。
任何帮助表示赞赏,只是为了清楚起见,我正试图找出我收到段错误的原因。
谢谢。
最佳答案
啊,编程中最好的错误之一,可怕的segmentation fault
!记录到 stdout
是一种调试方法,但您可以使用调试器(例如 gdb
)让自己的生活变得更轻松。
假设您的可执行文件名为 bfs
, 它产生了一个名为 core.bfs.12345
的核心转储(12345
是进程的 PID)。调用 gdb
像这样:
$ gdb ./bfs core.bfs.12345
进入后立即gdb
会告诉您哪里您的程序崩溃了——不需要打印语句!它应该是这样的:
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400d3e in BFS (mat=0x7fffffffd950, src=..., dest=...) at ../bfs/bfs.cxx:54
54 Point current = vertices.front();
本质上,它告诉您查看您调用了 queue<Point>::front()
的第 54 行(您的行号可能不同) .但是,如果队列为空,则调用 front()
是未定义的行为。
您的其余代码似乎都已步入正轨。我鼓励您重新考虑 while
循环条件。或许,有一种“更安全”的方式来判断是否继续搜索。
关于c++ - BFS for Maze C++ 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54355771/
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我正在尝试创建一个程序,该程序将遍历一个随机生成的迷宫,其中 1 是开放的,0 是墙壁。从左上角开始,到右下角结束。该路径可以向上、向下、向左、向右。 目前,我的程序为我提供了一种解决方案,但我无法让
这个小程序应该打印出迷宫中所有可能的路线,入口/起点总是从左上角向下一个,所有可能的导出总是在右墙上。它从文本文件中检索迷宫。 迷宫其实就是一堆文字。迷宫由 n x n 网格组成,由作为墙壁的“#”符
解迷宫的可能方法有哪些? 我有两个想法,但我认为它们不是很优雅。 基本情况:我们有一个矩阵,这个矩阵中的元素以一种表示迷宫的方式排序,有一条进路和一条出路。 我的第一个想法是让机器人沿着迷宫的一侧穿过
首先让我为尺寸道歉我会尽量保持它尽可能小 在尝试完全按照维基百科上所说的那样构建 prim 的算法后,我发现它无法按照我构建的迷宫方式运行。所以我尝试做同样的想法来适应我的迷宫,但我看到了一个奇怪的错
所以我的任务是创建一个迷宫解算器,其中包含一个队列、一个集合、一个位置对象和最终形成一个迷宫对象的单元格对象。 快速浏览一下我完成后所有代码的基本功能: 7 10 _ _ _ _ _ _ _ _
题目地址:https://leetcode-cn.com/problems/the-maze-ii/ 题目描述 There is a ball in a maze with empty space
我的问题本质上是对递归的怀疑。我正在解决经典的“迷宫中的老鼠”DFS 遍历问题。我的输入是一个 n*n int 数组 a[][],其中索引 i 和 j,a[i][j] 可以是 0 或 1。 0 表示假
我正在尝试为一个迷宫创建一个 BFS,该迷宫将在到达某个点时停止。在测试它时,我遇到了段错误(核心转储)错误。我正在尝试修改我在此 site 上找到的代码.我正在尝试做的事情与该站点中的代码之间的主要
我正在编写代码以读取代表“迷宫”的文件中的 7x15 文本 block 。 #include #include #include #include "board.h" int main() {
我正在开发一个合作伙伴项目,我的合作伙伴为游戏创建一个解算器类,而我的部分是创建 MazeGUI。 当您单击 Solve JButton 时,它应该突出显示它在 GUI 本身上所采取的路径,但它只突出
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我正在尝试使用 DisjSet
我一直在研究代码 war ,并且遇到了 mazerunner (https://www.codewars.com/kata/maze-runner/train/javascript),我已经被难住了大
我的目标是生成一个由 Cell 对象的二维数组组成的迷宫。下面是单元格和迷宫的代码。使用调试器我可以看到 boolean 值正在改变,并且生成按预期进行,但是当它得到打印时,没有路径。所有的墙都还在原
运行时检查失败 #2 变量“迷宫”周围的堆栈已损坏。每当我编译并运行我的程序时,只要程序完成运行,我就会收到此错误。我相信问题出在我的实现中的 addPaths 函数中。为了以防万一,我发布了所有代码
所以我在学习 C++ 的同时正在做学校作业。我不是在寻找给我的代码,而是在帮助理解/提出解决这个问题的正确算法。 我需要创建一个由 1 和 0 组成的 (5x5x5) 3d 迷宫。随机填充它(除了 0
我想创建一个带有迷宫(不是真的)的游戏。整个 map 应该被墙包围,而在这些墙内应该有一个迷宫。这个迷宫应该是随机创建的。在没有放置墙的每一 block 瓷砖上,玩家应该随机放置。 SpriteKit
我最近出现在一个工作面试中,我被问到一个流行的 RAT IN A MAZE 问题,其中有一个由二维数组表示的迷宫,其中分别包含 0 和 1 表示开放路径和墙壁,我们必须打印最短的路径。 我使用回溯法解
我最近一直在尝试在 Haskell 中创建一个迷宫求解器,并且我已经设法拼凑出一个大部分可用的算法。但是,我不知道如何确定给定的迷宫是否无法解决。 solveMazeQuickly :: Maze -
我尝试随机生成一个迷宫,但在编译下面的程序时出现段错误 这是代码 void spread(int v, int x, int y, int *t,int w, int *count){ //t
我是一名优秀的程序员,十分优秀!