#c #list
#c #Список
Вопрос:
Кто-нибудь может решить это за меня? Я не смог найти, почему он выдает ошибку в этих конкретных строках. Я предполагаю, что синтаксис правильный. Я прокомментировал строки с ошибками. Это выдает ошибку при open.push_back (p) в функции DFID и mylist.push_back (p); в функции GenerateChildren, пожалуйста, помогите мне с этим. Большое спасибо
#include <iostream>
#include <algorithm>
#include <list>
#include <string>
using namespace std;
const int n = 3;
int goal[n][n] = { { 1, 2, 3 },{ 8, 0, 4 },{ 7, 6, 5 } };
static int max_depth = 0;
list <int[3][3]> open;
list <string> closed;
bool DFID(int[3][3]);
list<int[3][3]> generateChildren(int[3][3]);
bool isGoal(int [3][3]);
string convertToString(int[3][3]);
bool inClosed(string);
void main()
{
int puzzle[n][n] = { { 1, 2, 3 }, { 8, 6, 4 }, { 7, 0, 5 } };
DFID(puzzle);
}
bool DFID(int p[3][3])
{
open.push_back(p); // Error on this line
open.pop_front();
list<int[3][3]> mylist = generateChildren(p);
list<int[3][3]>::iterator it;
for (it = mylist.begin(); it != mylist.end(); it)
{
if (isGoal(*it))
return true;
else
{
string s =convertToString(*it);
if (inClosed(s))
{
continue;
}
else
{
//
}
}
}
}
list<int[3][3]> generateChildren(int p[3][3])
{
//finding zero element
int a = 0, b = 0;
for (int i = 0; i < n; i )
{
for (int j = 0; i < n; j )
{
if (p[i][j] == 0)
{
a = i;
b = j;
break;
}
}
}
list <int[3][3]> mylist;
if (p[-a][b] != -1)
{
swap(p[a][b], p[--a][b]);
mylist.push_back(p); //Error on this line
}
if (p[a][--b] != -1)
{
swap(p[a][b], p[a][--b]);
mylist.push_back(p); //Error
}
if (p[ a][b] != 3)
{
swap(p[a][b], p[ a][b]);
mylist.push_back(p); //Error
}
if (p[a][ b] != 3)
{
swap(p[a][b], p[a][ b]);
mylist.push_back(p); //Error
}
return mylist;
}
bool isGoal(int p[3][3])
{
for (int i = 0; i < n; i )
{
for (int j = 0; i < n; j )
{
if (p[i][j] != goal[i][j]);
return false;
}
}
return true;
}
string convertToString(int p[3][3])
{
string puzz;
for (int i = 0; i < n; i )
{
for (int j = 0; j < n; j )
{
puzz = puzz to_string(p[i][j]);
}
}
return puzz;
}
bool inClosed(string s)
{
list<string>::iterator it;
for (it = closed.begin(); it != closed.end(); it)
{
if (*it == s);
return true;
}
return false;
}
Ответ №1:
Существует множество проблем с кодом, как вы его показываете.
Одна из проблем заключается в том, что помещение данных в контейнер означает, что их необходимо либо переместить, либо скопировать. А массивы нельзя ни перемещать, ни копировать.
Другая проблема заключается в том, что, например
bool DFID(int[3][3]);
равно
bool DFID(int(*)[3]);
То есть аргумент является указателем, а не массивом. Указатели и массивы — это разные вещи.
Один из возможных способов решить ваши проблемы (обе из них) — использовать другой стандартный контейнер, такой как std::array
:
std::array<std::array<int, n>, n> goal;
std::list<std::array<std::array<int, n>, n>> open;
Вы можете упростить тип с помощью псевдонима типа:
using matrix_type = std::array<std::array<int, n>, n>;
matrix_type goal;
std::list<matrix_type> open;