Posted by EnDleSs_DaRk on Fri 4 Sep 19:21
report abuse | download | new post
- #include <iostream>
- #include <string>
- using namespace std;
- //Colores de las celdas
- enum TipoCelda
- {Azul,Negro,Amarillo,Naranja,Rojo,Verde,Nada};
- //Clase celda
- class celda {
- private:
- TipoCelda tipocelda;
- int valor;
- public:
- //Set tipo de celda
- void setTipo(int tipo) {
- switch(tipo)
- {case 1:
- tipocelda = Azul;
- break;
- case 2:
- tipocelda = Negro;
- break;
- case 3:
- tipocelda = Amarillo;
- break;
- case 4:
- tipocelda = Naranja;
- break;
- case 5:
- tipocelda = Rojo;
- break;
- case 6:
- tipocelda = Verde;
- break;
- default:
- tipocelda = Nada;
- break;}
- }
- //Get tipo de celda
- int getTipo() {
- switch(tipocelda)
- {case Azul:
- return(1);
- break;
- case Negro:
- return(2);
- break;
- case Amarillo:
- return(3);
- break;
- case Naranja:
- return(4);
- break;
- case Rojo:
- return(5);
- break;
- case Verde:
- return(6);
- break;
- default:
- return(0);
- break;}
- }
- //Constructor de la clase celda
- celda(int mivalor=0) : valor(mivalor) {
- setTipo(valor);
- }
- };
- //Clase Columna
- class columna {
- private:
- celda celdas[5];
- int num1;
- int num2;
- int num3;
- int num4;
- int num5;
- int num6;
- public:
- //Comprueba si está resuelta
- bool esta_resuelta(){
- if ((celdas[0].getTipo()==0) && (celdas[5].getTipo()==0)) {
- if (celdas[1].getTipo()==celdas[2].getTipo()==celdas[3].getTipo()==celdas[4].getTipo()) return (true);
- else return(false);}
- else if (celdas[0].getTipo()==0) {
- if (celdas[1].getTipo()==celdas[2].getTipo()==celdas[3].getTipo()==celdas[4].getTipo()==celdas[5].getTipo()) return (true);
- else return(false);}
- else if (celdas[5].getTipo()==0) {
- if (celdas[0].getTipo()==celdas[1].getTipo()==celdas[2].getTipo()==celdas[3].getTipo()==celdas[4].getTipo()) return (true);
- else return(false);}
- }
- int get_superior1() {
- return(celdas[1].getTipo());
- }
- int get_superior2() {
- return(celdas[2].getTipo());
- }
- int get_inferior1() {
- return(celdas[3].getTipo());
- }
- int get_inferior2() {
- return(celdas[4].getTipo());
- }
- void set_par_superior(int valores[1]) {
- celdas[1].setTipo(valores[0]);
- celdas[2].setTipo(valores[1]);
- }
- void set_par_inferior(int valores[1]) {
- celdas[3].setTipo(valores[0]);
- celdas[4].setTipo(valores[1]);
- }
- //Constructor de la clase Columna
- columna(int valor1=0,int valor2=0,int valor3=0,int valor4=0,int valor5=0,int valor6=0) : num1(valor1),num2(valor2),num3(valor3),num4(valor4),num5(valor5),num6(valor6) {
- celdas[0]=num1;
- celdas[1]=num2;
- celdas[2]=num3;
- celdas[3]=num4;
- celdas[4]=num5;
- celdas[5]=num6;
- }
- //Desplazar la columna
- void desplazar(bool direccion) {
- int aux1,aux2;
- if (not direccion) {
- aux1 = celdas[0].getTipo();
- celdas[0].setTipo(0);
- aux2 = celdas[1].getTipo();
- celdas[1].setTipo(aux1);
- aux1 = celdas[2].getTipo();
- celdas[2].setTipo(aux2);
- aux2=celdas[3].getTipo();
- celdas[3].setTipo(aux1);
- aux1=celdas[4].getTipo();
- celdas[4].setTipo(aux2);
- celdas[5].setTipo(aux1);
- }
- else {
- aux1 = celdas[5].getTipo();
- celdas[5].setTipo(0);
- aux2 = celdas[4].getTipo();
- celdas[4].setTipo(aux1);
- aux1 = celdas[3].getTipo();
- celdas[3].setTipo(aux2);
- aux2=celdas[2].getTipo();
- celdas[2].setTipo(aux1);
- aux1=celdas[1].getTipo();
- celdas[1].setTipo(aux2);
- celdas[0].setTipo(aux1);
- }
- }
- };
- //Clase YoLocoLoco
- class yolocoloco{
- private:
- columna columnas[5];
- bool soporte_vertical;
- string solucion;
- string anteriores;
- char codificacion[23];
- public:
- //Comprueba si está resuelto
- bool esta_resuelto(){
- if (columnas[0].esta_resuelta() && columnas[1].esta_resuelta() && columnas[2].esta_resuelta() && columnas[3].esta_resuelta() && columnas[4].esta_resuelta()) return (true);
- else return (false);
- }
- //Constructor de la clase YoLocoLoco
- yolocoloco (int inicial[22]) {
- int columna_actual[5];
- int i;
- codificacion[0]='*';
- for (i=0;i<23;i++) {sprintf(&codificacion[i+1],"%d",inicial[i]);}
- soporte_vertical = false;
- columna_actual[5]=0;
- for (i=0;i<5;i++){
- columna_actual[i]=inicial[i];
- }
- columnas[0] = columna(columna_actual[0],columna_actual[1],columna_actual[2],columna_actual[3],columna_actual[4],columna_actual[5]);
- columna_actual[0]=0;
- columna_actual[5]=0;
- for (i=1;i<4;i++){
- columna_actual[i]=inicial[i+5];
- }
- columnas[1] = columna(columna_actual[0],columna_actual[1],columna_actual[2],columna_actual[3],columna_actual[4],columna_actual[5]);
- columna_actual[5]=0;
- for (i=0;i<5;i++){
- columna_actual[i]=inicial[i+9];
- }
- columnas[2] = columna(columna_actual[0],columna_actual[1],columna_actual[2],columna_actual[3],columna_actual[4],columna_actual[5]);
- columna_actual[5]=0;
- for (i=0;i<5;i++){
- columna_actual[i]=inicial[i+14];
- }
- columnas[3] = columna(columna_actual[0],columna_actual[1],columna_actual[2],columna_actual[3],columna_actual[4],columna_actual[5]);
- columna_actual[0]=0;
- columna_actual[5]=0;
- for (i=1;i<4;i++){
- columna_actual[i]=inicial[i+19];
- }
- columnas[4] = columna(columna_actual[0],columna_actual[1],columna_actual[2],columna_actual[3],columna_actual[4],columna_actual[5]);
- printf("inicializado!\n");
- }
- //Comprueba si es un ciclo
- bool es_ciclo(){
- string::size_type encontrado = anteriores.find(codificacion,0);
- if( encontrado != string::npos) {
- cout<<"Anteriores:"<<anteriores<<"\n";
- return (true);
- }
- else {
- anteriores.append(codificacion,23);
- return (false);
- }
- }
- //Movimiento del soporte vertical
- void mover_soporte_vertical() {
- columnas[0].desplazar(soporte_vertical);
- columnas[2].desplazar(soporte_vertical);
- columnas[3].desplazar(soporte_vertical);
- soporte_vertical = not soporte_vertical;
- solucion.append("1",1);
- printf("movido soporte vertical!\n");
- }
- //Movimiento del cilindro superior
- void mover_cilindro_superior(){
- int aux1[2],aux2[2];
- aux1[0] = columnas[0].get_superior1();
- aux1[1] = columnas[0].get_superior2();
- aux2[0] = columnas[1].get_superior1();
- aux2[1] = columnas[1].get_superior2();
- columnas[1].set_par_superior(aux1);
- aux1[0] = columnas[2].get_superior1();
- aux1[1] = columnas[2].get_superior2();
- columnas[2].set_par_superior(aux2);
- aux2[0] = columnas[3].get_superior1();
- aux2[1] = columnas[3].get_superior2();
- columnas[3].set_par_superior(aux1);
- aux1[0] = columnas[4].get_superior1();
- aux1[1] = columnas[4].get_superior2();
- columnas[4].set_par_superior(aux2);
- columnas[0].set_par_superior(aux1);
- solucion.append("2",4);
- //printf("movido cilindro superior!\n");
- }
- //Imprimir solución
- void imprimir_solucion(){
- cout<<"Solucion:"<<solucion<<"\n";
- }
- //Movimiento del cilindro inferior
- void mover_cilindro_inferior(){
- int aux1[1],aux2[1];
- aux1[0] = columnas[0].get_inferior1();
- aux1[1] = columnas[0].get_inferior2();
- aux2[0] = columnas[1].get_inferior1();
- aux2[1] = columnas[1].get_inferior2();
- columnas[1].set_par_inferior(aux1);
- aux1[0] = columnas[2].get_inferior1();
- aux1[1] = columnas[2].get_inferior2();
- columnas[2].set_par_inferior(aux2);
- aux2[0] = columnas[3].get_inferior1();
- aux2[1] = columnas[3].get_inferior2();
- columnas[3].set_par_inferior(aux1);
- aux1[0] = columnas[4].get_inferior1();
- aux1[1] = columnas[4].get_inferior2();
- columnas[4].set_par_inferior(aux2);
- columnas[0].set_par_inferior(aux1);
- solucion.append("3",4);
- }
- };
- //Funcion chunga y recursiva!
- void resolver(yolocoloco actual){
- if (actual.esta_resuelto()) printf("resuelto!!\n");
- else {
- if (not actual.es_ciclo()) {
- printf("creo el aux1!\n");
- yolocoloco aux1(actual);
- aux1.mover_cilindro_superior();
- resolver(aux1);
- printf("creo el aux2!\n");
- yolocoloco aux2(actual);
- aux2.mover_cilindro_inferior();
- resolver(aux2);
- printf("creo el aux3!\n");
- yolocoloco aux3(actual);
- aux3.mover_soporte_vertical();
- resolver(aux3);
- }
- }
- }
- //Clase Main
- int main() {
- printf("YoLocoLoco resolver 1.0\n");
- printf("=======================\n\n");
- printf("Sitúe el YoLocoLoco en posición vertical sobre la base\n");
- printf("antes de comenzar a introducir los datos, tome como\n");
- printf("referencia la columna de bolas que tiene cinco elementos\n");
- printf("con columnas de cuatro elementos a ambos lados.\n\n");
- printf("Las casillas van ordenadas de arriba hacia abajo y\n");
- printf("las columnas de izquierda a derecha.\n\n");
- int inicial[22];
- int indice = 0;
- int columna = 1;
- int casilla = 1;
- while (indice<23) {
- int valor = 0;
- while (valor<1 || valor>6) {
- printf("\n(1)Azul(2)Negro(3)Amarillo(4)Naranja(5)Rojo(6)Verde\n");
- printf("Introduce el color de la casilla %d, columna %d:",casilla,columna);
- scanf("%d",&valor);
- if (valor<1 || valor>6) printf ("Error: Código de color introducido inválido\n");
- }
- inicial[indice] = valor;
- indice++;
- casilla++;
- if ((indice==5) || (indice==9) || (indice==14) || (indice == 19)) {
- casilla = 1;
- columna++;
- }
- }
- printf("=======================\n\n");
- printf("Inicialización completada, calculando la solución...\n");
- yolocoloco juego(inicial);
- resolver(juego);
- return 0;}
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.