[C con Clase] Ayuda con la plantilla <vector>

David Reza l.fix3r.l en gmail.com
Mie Nov 11 01:32:05 CET 2009


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

=============================== CODE ===============================

#include <iostream>
#include <vector>

#define JARRA1 8
#define JARRA2 5
#define JARRA3 3

using namespace std;

//                                  Prototipos
bool comprobarNodoEnClose(Nodo nodo, vector <Nodo> Close );
bool nodoMeta(Nodo nodo);
void CrearNodo(vector <Nodo> &Open, int jar1, int jar2, int jar3);
void expandirNodo(Nodo nodo, vector <Nodo> Close, vector <Nodo> &Open);
void pasarAgua(int cant1, int cant2, int jar1, int jar2, int jar3, vector
<Nodo> &Open);
void tirarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
&Open);
void llenarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
&Open);
void meterEnOpen(Nodo nodo, vector <Nodo> &Open);
void meterEnClose(Nodo nodo, vector <Nodo> &Close);
Nodo sacarNodoDeOpen(vector <Nodo> &Open);
Nodo primerNodoDeOpen(vector <Nodo> Open);

class Nodo{
 public:
    int j[3];
    Nodo(int j1, int j2, int j3) {        // Constructor
        j[0] = j1;
        j[1] = j2;
        j[2] = j3;
    }
};

bool comprobarNodoEnClose(Nodo nodo, vector <Nodo> Close ){               //
Comprueba si el nodo está en CLOSE
    int cont = 0;     // Contador para recorrer la lista

    if (Close.empty())
        return false;
    else {
        while (cont < Close.size()) {
            if(Close.operator==(nodo))   // Comparar elementos de un vector
                return true;
            cont++;
        }
    }
}

bool nodoMeta(Nodo nodo){
    if (nodo.j[0] == 4 || nodo.j[1] == 4 || nodo.j[2] == 4)
        return true;
}

void CrearNodo(vector <Nodo> &Open, int jar1, int jar2, int jar3) {       //
Crea un nodo y lo mete en Open
    Nodo nuevo(jar1, jar2, jar3);
    meterEnOpen(nuevo, Open);
}

void expandirNodo(Nodo nodo, vector <Nodo> Close, vector <Nodo> &Open){
//Close para comprobar que no está en Close
    if (!comprobarNodoEnClose(nodo, Close)){          // Si NO está en Close
-> Expandir
        if (nodo.j[0] > 0 && nodo.j[1] != JARRA2)
            pasarAgua(nodo.j[0], nodo.j[1], 1, 2, 0, Open);
        if (nodo.j[0] > 0 && nodo.j[2] != JARRA3)
            pasarAgua(nodo.j[0], nodo.j[2], 1, 0, 2, Open);
        if (nodo.j[1] > 0 && nodo.j[0] != JARRA1)
            pasarAgua(nodo.j[1], nodo.j[0], 2, 1, 0, Open);
        if (nodo.j[1] > 0 && nodo.j[2] != JARRA3)
            pasarAgua(nodo.j[1], nodo.j[2], 0, 1, 2, Open);
        if (nodo.j[2] > 0 && nodo.j[0] != JARRA1)
            pasarAgua(nodo.j[2], nodo.j[0], 2, 0, 1, Open);
        if (nodo.j[2] > 0 && nodo.j[1] != JARRA2)
            pasarAgua(nodo.j[2], nodo.j[1], 0, 2, 1, Open);
        //    Si la jarra tiene agua, tirarla
        if (nodo.j[0] != 0)
            tirarAgua(nodo, 1, 0, 0, Open);
        if (nodo.j[1] != 0)
            tirarAgua(nodo, 0, 1, 0, Open);
        if (nodo.j[2] != 0)
            tirarAgua(nodo, 0, 0, 1, Open);
        //    Si la jarra no está llena, llenarla
        if (nodo.j[0] != JARRA1)
            llenarJarra(nodo, 1, 0, 0, Open);
        if (nodo.j[1] != JARRA2)
            llenarJarra(nodo, 0, 1, 0, Open);
        if (nodo.j[2] != JARRA3)
            llenarJarra(nodo, 0, 0, 1, Open);
    }
}

void pasarAgua(int cant1, int cant2, int jar1, int jar2, int jar3, vector
<Nodo> &Open){                 // Necesita la lista open parar pasarla
    int cant2copia =
0;
                                 // a la función CrearNodo() el cual mete el
nodo en Open
    if (jar1 == 1 && jar2 == 2){
        cant2copia = cant2;
        cant2 += cant1;
        if(cant2 > JARRA2) cant2 = JARRA2;
        cant2copia = cant2 - cant2copia;
        cant1 -= cant2copia;
        CrearNodo(Open, cant1, cant2, jar3);
    }
    if (jar1 == 1 && jar3 == 2){
        cant2copia = cant2;
        cant2 += cant1;
        if(cant2 > JARRA3) cant2 = JARRA3;
        cant2copia = cant2 - cant2copia;
        cant1 -= cant2copia;
        CrearNodo(Open, cant1, jar2, cant2);
    }
    if (jar2 == 1 && jar1 == 2){
        cant2copia = cant2;
        cant2 += cant1;
        if(cant2 > JARRA1) cant2 = JARRA1;
        cant2copia = cant2 - cant2copia;
        cant1 -= cant2copia;
        CrearNodo(Open, cant2, cant1, jar3);
    }
    if (jar2 == 1 && jar3 == 2){
        cant2copia = cant2;
        cant2 += cant1;
        if(cant2 > JARRA3) cant2 = JARRA3;
        cant2copia = cant2 - cant2copia;
        cant1 -= cant2copia;
        CrearNodo(Open, jar1, cant1, cant2);
    }
    if (jar3 == 1 && jar1 == 2){
        cant2copia = cant2;
        cant2 += cant1;
        if(cant2 > JARRA1) cant2 = JARRA1;
        cant2copia = cant2 - cant2copia;
        cant1 -= cant2copia;
        CrearNodo(Open, cant2, jar2, cant1);
    }
    if (jar3 == 1 && jar2 == 2){
        cant2copia = cant2;
        cant2 += cant1;
        if(cant2 > JARRA2) cant2 = JARRA2;
        cant2copia = cant2 - cant2copia;
        cant1 -= cant2copia;
        CrearNodo(Open, jar1, cant2, cant1);
    }
}

void tirarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
&Open){
    if (jar1 == 1) CrearNodo(Open, 0, jar2, jar3);
    if (jar2 == 1) CrearNodo(Open, jar1, 0, jar3);
    if (jar3 == 1) CrearNodo(Open, jar1, jar2, 0);
}

void llenarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
&Open){
    if (jar1 == 1) CrearNodo(Open, JARRA1, jar2, jar3);
    if (jar2 == 1) CrearNodo(Open, jar1, JARRA2, jar3);
    if (jar3 == 1) CrearNodo(Open, jar1, jar2, JARRA3);
}

void meterEnOpen(Nodo nodo, vector <Nodo> &Open){
    Open.push_back(nodo);
}

void meterEnClose(Nodo nodo, vector <Nodo> &Close){
    Close.push_back(nodo);
}

Nodo sacarNodoDeOpen(vector <Nodo> &Open){
    Nodo temporal = Open[0];
    for (int cont = 0; cont < Open.size(); cont++) {
        Open[cont] = Open[cont + 1];
    }
    Open.pop_back();
    return temporal;
}

Nodo primerNodoDeOpen(vector <Nodo> Open) {
    return Open[0];
}


//                                       INICIO
int main()
{
    vector <Nodo> Open;                                         //
LISTAS
    vector <Nodo> Close;

    Nodo principal(0,0,0);
    meterEnOpen(principal, Open);

    while (!Open.empty()) {


        if (nodoMeta(primerNodoDeOpen(Open))) {
            cout << "META ENCONTRADA!" << endl;
            return 0;
        }
        else {
        meterEnClose(primerNodoDeOpen(Open));  // Metemos nodo en Close
        expandirNodo(sacarNodoDeOpen(Open), Close, Open);   // Expandimos y
sacamos de Open
        }
    }

    cout << endl << endl << "No se encontró solución" << endl;

    return 0;
}

=================================================================================
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20091110/85758db2/attachment.html>


Más información sobre la lista de distribución Cconclase