Я пытаюсь создать BFS для лабиринта, который остановится, когда будет достигнута определенная точка.Во время тестирования я сталкиваюсь с ошибкой сегментации (ядро сбрасывается).Я пытаюсь изменить код, который я нашел на этом сайте .Основные различия между тем, что я пытаюсь сделать, и кодом на этом сайте в том, что мне не нужно выводить пройденное расстояние, поэтому я также должен вывести порядок в очереди, где вершины находятся внутри матрицы.Например, выходные данные должны быть следующими:
Какой должен быть вывод программы
Хэши представляют вершины, которые не добавляются в очередь, которой я являюсьне слишком озабочен ими на данный момент из-за этой ошибки, которая мешает мне двигаться вперед.
Вот мой код до сих пор:
#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 "Привет") происходит в определенных точкахпричина, чтобы найти источник ошибки, и это то, куда она меня привела.
Любая помощь приветствуется, и просто чтобы понять, я пытаюсь выяснить, почему я получаю ошибку ошибки сегментации.
Спасибо.