Ranas Saltarinas
Ranas Saltarinas
Ranas Saltarinas
cpp
// Busqueda en Anchura para el problema de las RanasSaltarinas
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
// Prototipo de Funciones.
struct Transformacion;
struct origen_destino;
bool busqueda();
bool esSolucion(vector<int>&);
void _swap(int i, int j, vector<int> &);
void encolarNuevaTransformacion( queue<Transformacion>&, stack<origen_destino>,
vector<int>,int, int);
void pintarPila(stack<origen_destino>);
// Constantes
int rana_izq = 1, rana_der = 2, vacio = -1;
// Structs
struct origen_destino{
int origen;
int destino;
};
bool busqueda(){
// centinela para encontrar la solución
bool solucion_encontrada = false;
// Variable de dimension para evitar sobrecarga en el procesador
int array_size = estado_inicial.size();
/* lista
* ranas
* movimientos
* origen-destino son palabras para recordar xDxDxDxD*/
aux = lista.front();
ranas = aux.estado; // Tablero Ranas del padre
if ( esSolucion(aux.estado) ){
solucion_encontrada = true;
// No eliminas porque el padre es el chido y despues debes mostrarlo
}else {
// Encolar los hijos
for (int i = 0; i < array_size; i++ ){
if ( ranas[i] == rana_izq && ranas[i+1]==-1){
// guardar transformacion
encolarNuevaTransformacion(lista, aux.movimientos, aux.estado,
i, i+1);
}else if ( ranas[i] == rana_izq && ranas[i+2]==-1){
// guardar transformacion
encolarNuevaTransformacion(lista, aux.movimientos, aux.estado,
i, i+2);
}else if ( ranas[i] == rana_der && ranas[i-1]==-1){
// guardar transformacion
encolarNuevaTransformacion(lista, aux.movimientos, aux.estado,
i, i-1);
}else if ( ranas[i] == rana_der && ranas[i-2]==-1){
// guardar transformacion
encolarNuevaTransformacion(lista, aux.movimientos, aux.estado,
i, i-2);
}
}// Fin de encolar hijos
// Eliminas al padre.
lista.pop();
}// Fin ELSE // Fin IF
return solucion_encontrada;
}
// guardar transformacion
origen_destino od = {i, j};
misMovimientos.push(od); // Nuevos cambios a Movimientos
_swap(i, j, miTableroRanas); // Nuevos cambios a Estado
l.push(miTransformacion);
int main(){
estado_inicial = {1,1,1,1,1,1,-1,2,2,2,2,2,2};
estado_final = {2,2,2,2,2,2,-1,1,1,1,1,1,1};
bool si = busqueda();
if (si){
Transformacion t = lista.front();
stack<origen_destino> result = t.movimientos;
pintarPila(result);
}
return 0;
}