Misioneros y Canibales Ja ja ja me hice
Misioneros y Canibales Ja ja ja …. me hice la pichi Cesar Liza Avila creadores@hotmail. com www. cesarliza. com
Misioneros y Caníbales 3 misioneros y 3 caníbales se encuentran en la orilla del río. En dicha orilla hay una balsa que puede transportar a máximo 2 personas. Si en algún momento, hay menos misioneros que caníbales, los caníbales se los cenaran. Encuentre el número mínimo de viajes en balsa, para que sean transportados todos los misioneros y caníbales, sin que los misioneros sean devorados.
Misioneros y Canibales
# include <iostream> Misioneros. Canibales. cpp # include <iomanip> # include "Misioneros. Canibales. h" using namespace std; void encola. Candidatos(int, struct cola &, struct nodo *, int); void imprime. Sol(struct nodo *ele) { if(ele) { imprime. Sol(ele->padre); cout<< ele->m 1 <<" "<<ele->c 1 <<" --- "<<ele->m 2<<" "<<ele->c 2 <<endl; cout<<endl; } } void imp. Cola(struct cola q) { struct nodo *lista=q. delante; while (lista!=NULL) { cout<< lista->m 1 <<" "<<lista->c 1 <<" --- "<<lista->m 2<<" "<<lista->c 2; if (lista == q. delante) cout<<" <--Delante"; if (lista == q. actual) cout<<" <--Actual"; if (lista == q. atras) cout<<" <--Atras"; cout<<endl; lista=lista->sgte; } cout<<endl; }
void main(void) { struct cola q; // es la cola int m 1=3, m 2=0; int c 1=3, c 2=0; int barca=1; // la barca esta en orilla 1 cout<<"Buscando en anchura. . . "<<endl; inicializa(q); encola(q, m 1, m 2, c 1, c 2, NULL, barca); //encola elemento while (q. actual!=NULL) { imp. Cola(q); cin. get(); struct nodo *ele= desencola(q); m 1=ele->m 1; m 2=ele->m 2; c 1=ele->c 1; c 2=ele->c 2; barca=ele->barca; if( m 1==0 && c 1==0 && m 2==3 && c 2==3 ) { cout<<"Solucion encontrada. . "<<endl; imprime. Sol(ele); exit(0); } cout<<"-----Padre "<<m 1<<" "<<c 1<<" "<<m 2<<" "<<c 2<<"b= "<<barca<<endl; encola. Candidatos(m 1, m 2, c 1, c 2, q, ele, barca); } cout<<"Despues de analizar todas las alternativas no llegue a la solucion"<<endl; }
void encola. Candidatos(int m 1, int m 2, int c 1, int c 2, struct cola &q, struct nodo *ele, int barca) { //------ la barca parte de orilla A hacia orilla B -------if (barca==1) { // viajan 2 misioneros if ( m 1>=2 && (m 1 -2>=c 1 || m 1 -2==0) && ( m 2+2>=c 2||m 2+2==0) ) if (!buscar. Estado(m 1 -2, m 2+2, c 1, c 2, q, 2) ) encola(q, m 1 -2, m 2+2, c 1, c 2, ele, 2); // viajan 2 canibales if ( c 1>=2 && ( (m 1>=c 1 -2) || m 1==0) && ( m 2>=c 2+2||m 2==0) ) if (!buscar. Estado(m 1, m 2, c 1 -2, c 2+2, q, 2) ) encola(q, m 1, m 2, c 1 -2, c 2+2, ele, 2); // viajan 1 misionero y 1 canibal if (m 1>=1 && c 1>=1 && ( ( (m 1 -1)>=(c 1 -1) ) ||m 1 -1==0 ) && ( ((m 2+1)>=(c 2+1)) ||m 2+1==0) ) if (!buscar. Estado(m 1 -1, m 2+1, c 1 -1, c 2+1, q, 2) ) encola(q, m 1 -1, m 2+1, c 1 -1, c 2+1, ele, 2); // viajan 1 misionero if (m 1>=1 && ( (m 1 -1>=c 1) ||m 1 -1==0 )&& ( (m 2+1>=c 2 ) ||m 2+1==0) ) if (!buscar. Estado(m 1 -1, m 2+1, c 2, q, 2) ) encola(q, m 1 -1, m 2+1, c 2, ele, 2); // viajan 1 canibal if (c 1>=1 && ( (m 1 >=c 1 -1) || m 1==0) && ((m 2>=c 2+1) ||m 2==0) ) if (!buscar. Estado(m 1, m 2, c 1 -1, c 2+1, q, 2) ) encola(q, m 1, m 2, c 1 -1, c 2+1, ele, 2); }
//------ la barca parte de orilla B hacia orilla A -------else { // viajan 2 misioneros if (m 2>=2 && ((m 2 -2>=c 2) ||m 2 -2==0) && ((m 1+2 >=c 1) ||m 1+2==0) ) if (!buscar. Estado(m 1+2, m 2 -2, c 1, c 2, q, 1) ) encola(q, m 1+2, m 2 -2, c 1, c 2, ele, 1); // viajan 2 canibales if (c 2>=2 && ( (m 2>=c 2 -2) ||m 2==0) && ((m 1>=c 1+2) || m 1==0) ) if (!buscar. Estado(m 1, m 2, c 1+2, c 2 -2, q, 1) ) encola(q, m 1, m 2, c 1+2, c 2 -2, ele, 1); // viajan 1 misionero y 1 canibal if (m 2>=1 && c 2>=1 && ((m 2 -1 >=c 2 -1) ||m 2 -1==0) && ((m 1+1>=c 1+1) ||m 1+1==0) ) if (!buscar. Estado(m 1+1, m 2 -1, c 1+1, c 2 -1, q, 1) ) encola(q, m 1+1, m 2 -1, c 1+1, c 2 -1, ele, 1); // viajan 1 misionero if (m 2>=1 && ((m 2 -1>=c 2) ||m 2 -1==0 )&& ((m 1+1>=c 1) || m 1+1==0) ) if (!buscar. Estado(m 1+1, m 2 -1, c 2, q, 1) ) encola(q, m 1+1, m 2 -1, c 2, ele, 1); // viajan 1 canibal if (c 2>=1 && ((m 2>=c 2 -1) ||m 2==0 )&& ((m 1>=c 1+1) || m 1==0)) if (!buscar. Estado(m 1, m 2, c 1+1, c 2 -1, q, 1) ) encola(q, m 1, m 2, c 1+1, c 2 -1, ele, 1); } }
struct nodo { int m 1; int m 2; int c 1; int c 2; int barca; struct nodo *padre; struct nodo *sgte; }; // estructura de la cola struct cola { struct nodo *delante; //apunta a primero struct nodo *actual; //apunta al elemento que vamos a procesar struct nodo *atras; //apunta a ultimo }; // ---inicializa cola ------void inicializa(struct cola &q) { q. delante= NULL; q. actual = NULL; q. atras = NULL; } void encola(struct cola &q, int m 1, int m 2, int c 1, int c 2, struct nodo *padre, int barca) // ---- inserta al final de cola { struct nodo *p; // p apunta a items de la cola p = new(struct nodo); // memoria para nuevo item p->m 1 = m 1; p->m 2 = m 2; p->c 1 = c 1; p->c 2 = c 2; p->barca = barca; p->sgte = NULL; // se convierte en el ultimo item if(q. actual == NULL) q. actual = p; if (q. delante == NULL) { q. delante = p; // encola el primer item p->padre = NULL; } else { (q. atras)->sgte = p; //si no apunta a nuevo item p->padre = padre; } q. atras = p; //el ultimo item es ahora el ingresado } Misioneros. Canibales. h // --- retira elemento de cola struct nodo *desencola(struct cola &q) { struct nodo *r = q. actual; q. actual = (q. actual)->sgte; // retiro item de la cola return r; } bool buscar. Estado ( int m 1, int m 2, int c 1, int c 2, struct cola q, int barca) { struct nodo *lista=q. delante; while (lista!=NULL) { if ( lista->m 1==m 1 && lista->m 2==m 2 && lista->c 1 == c 1 && lista->c 2==c 2 && lista>barca==barca ) return true; lista=lista->sgte; } return false; }
- Slides: 9