Ошибка не удается преобразовать аргумент 1 из ‘int[][3] в int(

#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;