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>