int main(void){ system("clear"); int coord[2]; char letra[2]; int numBarcos = 3; iniciarTablero(); for(numBarcos = 0 ; numBarcos < 3 ; numBarcos++){ mostrarTablero(); printf("Ingrese BARCO N° %d de 3: \nLETRA(minuscula): ", numBarcos+1); scanf("%s", letra); switch(letra[0]){ case 'a' : coord[0] = 0; break; case 'b' : coord[0] = 1; break; case 'c' : coord[0] = 2; break; case 'd' : coord[0] = 3; break; case 'e' : coord[0] = 4; break; } printf("NUMERO: "); scanf("%d",&coord[1]); ingresoBarcos(coord); } mostrarTablero(); return 0; }
int colocarReina (int fila, int reinas[], int n, bool& todas) //todas indica que hemos llegado a una solución factible { int ok = FALSE; if (!todas && fila < n) { // Quedan reinas por colocar reinas[fila] = 0; while(!todas && reinas[fila] < n) { // Comprobamos si la posición de la reina actual es válida if (comprobar(fila,reinas,n)) { // Si es así, intentamos colocar colocarReina (fila+1, reinas, n, todas); // las reinas restantes } reinas[fila]++; } }else{ // No quedan reinas por colocar (solución) todas = true; mostrarTablero(reinas,n); } return ok; }
void Ejercicio3::rompecolores(int filaAnterior, int columnaAnterior){ int fila = 0; int columna = 0; // Nos movemos de fila y columna columna = columnaAnterior+1; fila = filaAnterior; if(columna > columnas-1){ fila = filaAnterior+1; if(fila > filas-1){ //Se termino el tablero, se termino el algoritmo return; } columna = 0; } // Chequeamos todas las piezas posibles. list<int> piezasNro = autofill->damePosibles(tablero, fila, columna); list<int>::iterator it; for (it = piezasNro.begin(); it != piezasNro.end(); it++){ /** * Se itera en la cantidad de piezas posibles pidiendo al autofill, en cada paso de la iteración, que * llene la posición. Si el autofill no pudo llenarla, pasamos a la próxima ficha. Si salimos del for * sin meter fichas, entonces hacemos el paso recursivo contemplando la posibilidad de dejar el espacio * en blanco. */ // Llama a autofill para poner una pieza, en caso de que autofill falle, retorna false, en caso de que // inserte una pieza, se ajustan los contadores. if (!llenarPosicion(fila, columna, *it)){ continue; } mostrarTablero(tablero, filas, columnas); // Si pudimos ubicar mas piezas, entonces encontramos una mejor solucion. if(numPiezasUbicadas > numPiezasMejorSol){ numPiezasMejorSol = numPiezasUbicadas; mejorSolucion = tablero; } /** * -- PODA -- * Si las posiciones restantes más el número de piezas ubicadas es menor que la cantidad de piezas en la * mejor solucion, se corta, ya que por más que se puedan ubicar piezas en las posiciones no alcanza. * Por otro lado, si el máximo cantidad de fichas que se puede ubicar más las piezas ubicadas es menor * que la cantidad de la mejor solución también se corta. Para resolver ambos casos sólo hace falta * sacar el mínimo entre las posiciones del tablero y la máxima cantidad de piezas por ubicar. */ if (poda_habilitada){ int numPosicionesRestantes = numPosicionesTablero - numPosicionesAnalizadas; int posibilidades = min(numPosicionesRestantes, numPiezasPorUbicar); if ((posibilidades + numPiezasUbicadas) <= numPiezasMejorSol){ // LLama a autofill para vaciar la posicion y ajusta los contadores. vaciarPosicion(fila, columna, *it); //mostrarTablero(tablero, filas, columnas); return; } } // Se hace el llamado recursivo. rompecolores(fila, columna); // Llama a autofill para vaciar la posicion y ajusta los contadores. vaciarPosicion(fila, columna, *it); } // Ponemos en la posición la ficha blanca dejarBlanco(fila, columna); mostrarTablero(tablero, filas, columnas); // Llamado recursivo rompecolores(fila, columna); // Quitamos de la posición la ficha blanca. quitarBlanco(fila, columna); }
void Ejercicio3::mostrarMejorSolucion(){ cout << "Mejor solucion: " << endl; mostrarTablero(mejorSolucion, filas, columnas); }