Я работаю над проектом об 8-пазле N-queens для школы и уже неделю сталкиваюсь с проблемой.Я должен реализовать функцию поиска единой стоимости, чтобы решить игру.Я реализовал BFS и DFS, это сработало.Но с UCS у меня есть ошибка Сегментации, которая, вероятно, связана с моей функцией popBest, потому что BFS и UCS связаны.Кроме того, ошибка сегментации также связана с temp в моем коде, потому что при ее удалении ошибки нет.Спасибо за помощь.Вот мой код:
Item* popBest(list_t* list)
{
assert(list);
assert(list->numElements);
assert(list->first);
// the first element is best.
Item* best = list->first;
int minf = best->f;
// Search from the second element (if it exists).
Item* item = best->next;
while (item) {
if (item->f < minf) {
minf = item->f;
best = item;
}
item = item->next;
}
delList(list, best);
return best;
}
void ucs(void)
{
Item *cur_node, *child_p, *temp;
int i;
cur_node->f = 0;
while (listCount(&openList_p)) {
cur_node = popBest(&openList_p);
addFirst(&closedList_p, cur_node);
if (evaluateBoard(cur_node) == 0.0) {
showSolution(cur_node);
printf("\nParcours en largeur (bfs)\n");
return;
}
else {
/* Enumerate adjacent states */
for (i = 0; i < MAX_BOARD; i++) {
child_p = getChildBoard(cur_node, i);
child_p->f = cur_node->f + 1;
if (child_p != NULL) { // it's a valid child!
temp = onList(&openList_p, child_p->board);
/* Ignore this child if already visited */
if (temp == NULL) {
/* Add child node to openList*/
addLast(&openList_p, child_p);
}
else if (temp != NULL && child_p->f < temp->f) {
delList(&openList_p, temp);
addLast(&openList_p, child_p);
}
}
}
}
}
return;
}