& Quot; free (): неверный указатель: & quot; 8-головоломка BFS

Я пытаюсь написать первую поисковую программу для решения 8-ми задач. Когда я запускаю следующий код, я получаю следующую ошибку:

* Ошибка в `/home/a.out ‘: free (): неверный указатель: 0x0000000001f81430 *
Отменено

Я уверен, что проблема заключается в использовании этот указатель и как я храню родительские узлы. Любая помощь?

 #include <iostream>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
class Node {
public:

vector<Node> children;
vector<int> puzzle;
vector<int> goal = {1, 2, 3, 4, 5, 6, 7, 8, 0};
Node *parent;

Node(vector<int> _puzzle, Node *_parent){   // constructor for node
puzzle=_puzzle;
parent=_parent;
}

void moveUp(){    //function to move up
int zPos = findZero();
vector<int> temp = puzzle;
if ( zPos != 0 || zPos != 1 || zPos != 2 )
std::swap(temp[zPos], temp[zPos-3]);
Node child = Node(temp, this);
children.push_back(child);
}

void moveDown(){    //function to move down
int zPos = findZero();
vector<int> temp = puzzle;
if ( zPos != 6 || zPos != 7 || zPos != 8 )
std::swap(temp[zPos], temp[zPos+3]);
Node child = Node(temp, this);
children.push_back(child);
}

void moveRight(){    //function to move right
int zPos = findZero();
vector<int> temp = puzzle;
if ( zPos != 2 || zPos != 5 || zPos != 8 )
std::swap(temp[zPos], temp[zPos+1]);
Node child = Node(temp, this);
children.push_back(child);
}void moveLeft(){     //function to move left
int zPos = findZero();
vector<int> temp = puzzle;
if ( zPos != 0 || zPos != 3 || zPos != 6 )
std::swap(temp[zPos], temp[zPos-1]);
Node child = Node(temp, this);
children.push_back(child);
}

void printPuzzle() {    //function to print the puzzle
int count = 0;
for (auto i: puzzle) {
if ( count % 3 == 0)
std::cout << std::endl;
std::cout << i << ' ';
count++;
}
}

int findZero(){    // function to find the location of zero
std::vector<int>::iterator it;
it = find (puzzle.begin(), puzzle.end(), 0);
auto z = std::distance(puzzle.begin(), it);
return (int)z;
}

bool isGoal(){  //function to check if goal state is reached
bool goalFound = false;
if(puzzle == goal)
goalFound = true;
return goalFound;
}

};bool contains(std::queue<Node> q, Node n){   // checks repeated nodes
std::queue<Node> tempQ = q;
bool exist = false;
while (!tempQ.empty()){
if (tempQ.front().puzzle == n.puzzle)
exist = true;
tempQ.pop();
}
return exist;
}

int main()
{
std::vector<int> initial = {3, 5, 8, 1, 0, 4, 2, 7, 6};
Node init = Node(initial, NULL);
std::queue<Node> openList;
std::queue<Node> closedList;
openList.push(init);
bool goalFound = false;
while(!openList.empty() && !goalFound){
Node currentNode = openList.front();
closedList.push(currentNode);
openList.pop();
currentNode.moveUp();
currentNode.moveDown();
currentNode.moveRight();
currentNode.moveLeft();

for (auto i: currentNode.children){
Node currentChild = i;
if (currentChild.isGoal()){
std::cout << "Goal Found." << endl;
goalFound = true;
}
if (!contains(openList, currentChild) && !contains(closedList, currentChild))
openList.push(currentChild);
}
}
}

Сейчас я сосредоточен только на поиске цели. Мне еще предстоит реализовать путь к цели и напечатать окончательное решение.

-2

Решение

if (zPos != 0 || zPos != 1 || zPos != 2)

Должно быть

if (zPos != 0 && zPos != 1 && zPos != 2)

И то же самое для его братьев и сестер в других функциях движения.

TL; DR объяснение:

в moveUp

if (zPos != 0 || zPos != 1 || zPos != 2)

не может делать то, что вы хотите. Тело всегда будет исполнено, потому что zPos не может быть 0, 1 и 2 одновременно. Например, если zPos тогда ноль

if (0 != 0 || 0 != 1 || 0 != 2)
false  || true

Один true достаточно.

Это означает, что

std::swap(temp[0], temp[0-3]);

поменяет 0, -3 и выйдет за пределы. Все виды странных может случиться, когда вы запутаетесь с памятью за пределами границ, и я думаю, что на этот раз вы перезаписываете часть бухгалтерского учета для vectorбуфер хранения. Как только vector освобожден, каБламо!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector