Hola a todos, me gustaría que me ayudaran a explicarme un poco el código que hice sobre el problema de las 3 jarras. Lo que sucede es que casi no sé mucho de clases y me da muchos errores de que la clase Nodo no está al alcance de las demás funciones que tengo. Espero contar con su ayuda; a continuación el código<br>
<br>=============================== CODE ===============================<br><br>#include <iostream><br>#include <vector><br><br>#define JARRA1 8<br>#define JARRA2 5<br>#define JARRA3 3<br><br>using namespace std;<br>
<br>//                                  Prototipos<br>bool comprobarNodoEnClose(Nodo nodo, vector <Nodo> Close );<br>bool nodoMeta(Nodo nodo);<br>void CrearNodo(vector <Nodo> &Open, int jar1, int jar2, int jar3);<br>
void expandirNodo(Nodo nodo, vector <Nodo> Close, vector <Nodo> &Open);<br>void pasarAgua(int cant1, int cant2, int jar1, int jar2, int jar3, vector <Nodo> &Open);<br>void tirarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo> &Open);<br>
void llenarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo> &Open);<br>void meterEnOpen(Nodo nodo, vector <Nodo> &Open);<br>void meterEnClose(Nodo nodo, vector <Nodo> &Close);<br>Nodo sacarNodoDeOpen(vector <Nodo> &Open);<br>
Nodo primerNodoDeOpen(vector <Nodo> Open);<br><br>class Nodo{<br> public:<br>    int j[3];<br>    Nodo(int j1, int j2, int j3) {        // Constructor<br>        j[0] = j1;<br>        j[1] = j2;<br>        j[2] = j3;<br>
    }<br>};<br><br>bool comprobarNodoEnClose(Nodo nodo, vector <Nodo> Close ){               // Comprueba si el nodo está en CLOSE<br>    int cont = 0;     // Contador para recorrer la lista<br><br>    if (Close.empty())<br>
        return false;<br>    else {<br>        while (cont < Close.size()) {<br>            if(Close.operator==(nodo))   // Comparar elementos de un vector<br>                return true;<br>            cont++;<br>        }<br>
    }<br>}<br><br>bool nodoMeta(Nodo nodo){<br>    if (nodo.j[0] == 4 || nodo.j[1] == 4 || nodo.j[2] == 4)<br>        return true;<br>}<br><br>void CrearNodo(vector <Nodo> &Open, int jar1, int jar2, int jar3) {       // Crea un nodo y lo mete en Open<br>
    Nodo nuevo(jar1, jar2, jar3);<br>    meterEnOpen(nuevo, Open);<br>}<br><br>void expandirNodo(Nodo nodo, vector <Nodo> Close, vector <Nodo> &Open){   //Close para comprobar que no está en Close<br>    if (!comprobarNodoEnClose(nodo, Close)){          // Si NO está en Close -> Expandir<br>
        if (nodo.j[0] > 0 && nodo.j[1] != JARRA2)<br>            pasarAgua(nodo.j[0], nodo.j[1], 1, 2, 0, Open);<br>        if (nodo.j[0] > 0 && nodo.j[2] != JARRA3)<br>            pasarAgua(nodo.j[0], nodo.j[2], 1, 0, 2, Open);<br>
        if (nodo.j[1] > 0 && nodo.j[0] != JARRA1)<br>            pasarAgua(nodo.j[1], nodo.j[0], 2, 1, 0, Open);<br>        if (nodo.j[1] > 0 && nodo.j[2] != JARRA3)<br>            pasarAgua(nodo.j[1], nodo.j[2], 0, 1, 2, Open);<br>
        if (nodo.j[2] > 0 && nodo.j[0] != JARRA1)<br>            pasarAgua(nodo.j[2], nodo.j[0], 2, 0, 1, Open);<br>        if (nodo.j[2] > 0 && nodo.j[1] != JARRA2)<br>            pasarAgua(nodo.j[2], nodo.j[1], 0, 2, 1, Open);<br>
        //    Si la jarra tiene agua, tirarla<br>        if (nodo.j[0] != 0)<br>            tirarAgua(nodo, 1, 0, 0, Open);<br>        if (nodo.j[1] != 0)<br>            tirarAgua(nodo, 0, 1, 0, Open);<br>        if (nodo.j[2] != 0)<br>
            tirarAgua(nodo, 0, 0, 1, Open);<br>        //    Si la jarra no está llena, llenarla<br>        if (nodo.j[0] != JARRA1)<br>            llenarJarra(nodo, 1, 0, 0, Open);<br>        if (nodo.j[1] != JARRA2)<br>
            llenarJarra(nodo, 0, 1, 0, Open);<br>        if (nodo.j[2] != JARRA3)<br>            llenarJarra(nodo, 0, 0, 1, Open);<br>    }<br>}<br><br>void pasarAgua(int cant1, int cant2, int jar1, int jar2, int jar3, vector <Nodo> &Open){                 // Necesita la lista open parar pasarla<br>
    int cant2copia = 0;                                                                                                           // a la función CrearNodo() el cual mete el nodo en Open<br>    if (jar1 == 1 && jar2 == 2){<br>
        cant2copia = cant2;<br>        cant2 += cant1;<br>        if(cant2 > JARRA2) cant2 = JARRA2;<br>        cant2copia = cant2 - cant2copia;<br>        cant1 -= cant2copia;<br>        CrearNodo(Open, cant1, cant2, jar3);<br>
    }<br>    if (jar1 == 1 && jar3 == 2){<br>        cant2copia = cant2;<br>        cant2 += cant1;<br>        if(cant2 > JARRA3) cant2 = JARRA3;<br>        cant2copia = cant2 - cant2copia;<br>        cant1 -= cant2copia;<br>
        CrearNodo(Open, cant1, jar2, cant2);<br>    }<br>    if (jar2 == 1 && jar1 == 2){<br>        cant2copia = cant2;<br>        cant2 += cant1;<br>        if(cant2 > JARRA1) cant2 = JARRA1;<br>        cant2copia = cant2 - cant2copia;<br>
        cant1 -= cant2copia;<br>        CrearNodo(Open, cant2, cant1, jar3);<br>    }<br>    if (jar2 == 1 && jar3 == 2){<br>        cant2copia = cant2;<br>        cant2 += cant1;<br>        if(cant2 > JARRA3) cant2 = JARRA3;<br>
        cant2copia = cant2 - cant2copia;<br>        cant1 -= cant2copia;<br>        CrearNodo(Open, jar1, cant1, cant2);<br>    }<br>    if (jar3 == 1 && jar1 == 2){<br>        cant2copia = cant2;<br>        cant2 += cant1;<br>
        if(cant2 > JARRA1) cant2 = JARRA1;<br>        cant2copia = cant2 - cant2copia;<br>        cant1 -= cant2copia;<br>        CrearNodo(Open, cant2, jar2, cant1);<br>    }<br>    if (jar3 == 1 && jar2 == 2){<br>
        cant2copia = cant2;<br>        cant2 += cant1;<br>        if(cant2 > JARRA2) cant2 = JARRA2;<br>        cant2copia = cant2 - cant2copia;<br>        cant1 -= cant2copia;<br>        CrearNodo(Open, jar1, cant2, cant1);<br>
    }<br>}<br><br>void tirarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo> &Open){<br>    if (jar1 == 1) CrearNodo(Open, 0, jar2, jar3);<br>    if (jar2 == 1) CrearNodo(Open, jar1, 0, jar3);<br>    if (jar3 == 1) CrearNodo(Open, jar1, jar2, 0);<br>
}<br><br>void llenarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo> &Open){<br>    if (jar1 == 1) CrearNodo(Open, JARRA1, jar2, jar3);<br>    if (jar2 == 1) CrearNodo(Open, jar1, JARRA2, jar3);<br>    if (jar3 == 1) CrearNodo(Open, jar1, jar2, JARRA3);<br>
}<br><br>void meterEnOpen(Nodo nodo, vector <Nodo> &Open){<br>    Open.push_back(nodo);<br>}<br><br>void meterEnClose(Nodo nodo, vector <Nodo> &Close){<br>    Close.push_back(nodo);<br>}<br><br>Nodo sacarNodoDeOpen(vector <Nodo> &Open){<br>
    Nodo temporal = Open[0];<br>    for (int cont = 0; cont < Open.size(); cont++) {<br>        Open[cont] = Open[cont + 1];<br>    }<br>    Open.pop_back();<br>    return temporal;<br>}<br><br>Nodo primerNodoDeOpen(vector <Nodo> Open) {<br>
    return Open[0];<br>}<br><br><br>//                                       INICIO<br>int main()<br>{<br>    vector <Nodo> Open;                                         //       LISTAS<br>    vector <Nodo> Close;<br>
<br>    Nodo principal(0,0,0);<br>    meterEnOpen(principal, Open);<br><br>    while (!Open.empty()) {<br><br><br>        if (nodoMeta(primerNodoDeOpen(Open))) {<br>            cout << "META ENCONTRADA!" << endl;<br>
            return 0;<br>        }<br>        else {<br>        meterEnClose(primerNodoDeOpen(Open));  // Metemos nodo en Close<br>        expandirNodo(sacarNodoDeOpen(Open), Close, Open);   // Expandimos y sacamos de Open<br>
        }<br>    }<br><br>    cout << endl << endl << "No se encontró solución" << endl;<br><br>    return 0;<br>}<br><br>=================================================================================<br>