Ошибка не может преобразовать аргумент 1 из 'int [] [3] в int (&&) [3] [3]' - PullRequest
0 голосов
/ 20 марта 2019

Может кто-нибудь решить это для меня?Я не мог найти, почему это дает ошибку в этих конкретных строках.Я думаю, синтаксис правильный.Я прокомментировал строки ошибок.Выдает ошибку в 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 Ответ

3 голосов
/ 20 марта 2019

Существует несколько проблем с кодом при его отображении.

Одна проблема заключается в том, что помещение данных в контейнер означает, что их необходимо либо переместить, либо скопировать.И массивы нельзя ни перемещать, ни копировать.

Другая проблема заключается в том, что, например,

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...