Este problema utiliza un esquema igual al utilizado en la solución del problema del salto del caballo, modelando el tablero como una matriz de n x n y utilizando un enfoque de backtracking para marcar una casilla, generar una lista de las siguientes casillas que no están amenazadas y revisar dicha lista en forma recursiva; si no se llega a la respuesta correcta, se devuelve el proceso para continuar con las siguiente casillas de la lista.
public class ProblemaReinas { final int numFilas; final int numColumnas; int[][] tablero; int contador; public ProblemaReinas(int nf) { numFilas = nf; numColumnas = nf; tablero = new int[nf][nf]; } public void mostrarTablero() { for(int i=0; i<tablero.length; i++) { for(int j=0; j<tablero[i].length; j++) { if(tablero[i][j]>0) System.out.printf(" %2d |", tablero[i][j]); else System.out.printf(" |", tablero[i][j]); } System.out.println(); for(int j=0; j<tablero[i].length; j++) System.out.print("------+"); System.out.println(); } } public boolean resolverProblema(int f, int c, int num) { contador++; tablero[f][c] = num; if(num==numFilas) return true; int[][] posibles = buscarPosibles(); for(int i=0; i<posibles.length; i++) { if(resolverProblema(posibles[i][0], posibles[i][1], num+1)) return true; } tablero[f][c]=0; return false; } int[][] buscarPosibles() { int[][] resp = new int[numFilas*numColumnas][2]; int[] sumaFilas = new int[numColumnas]; int[] sumaColumnas = new int[numFilas]; int pos = 0; for(int i=0; i<numFilas; i++) { for(int j=0; j<numColumnas; j++) { if(tablero[i][j]>0) { sumaFilas[i]++; sumaColumnas[j]++; } } } for(int i=0; i<numFilas; i++) { if(sumaFilas[i]>0) continue; for(int j=0; j<numColumnas; j++) { if(sumaColumnas[j]>0) continue; if(i>0 && j>0 && tablero[i-1][j-1] > 0) continue; if(i>0 && j<numColumnas-1 && tablero[i-1][j+1] > 0) continue; if(i<numFilas-1 && j>0 && tablero[i+1][j-1] > 0) continue; if(i<numFilas-1 && j<numColumnas-1 && tablero[i+1][j+1] > 0) continue; resp[pos][0]=i; resp[pos][1]=j; pos++; } } int[][] tmp = new int[pos][2]; for(int i=0; i<pos; i++) { tmp[i][0] = resp[i][0]; tmp[i][1]=resp[i][1]; } return tmp; } boolean esValido(int f, int c) { if(f<0 || f>numFilas-1 || c<0 || c>numColumnas-1) return false; if(tablero[f][c]!=0) return false; return true; } public static void main(String[] args) { java.util.Random rnd = new java.util.Random(); int numFilas = 8; int filaInicial = rnd.nextInt(numFilas); int colInicial = rnd.nextInt(numFilas); ProblemaReinas pr = new ProblemaReinas(8); pr.resolverProblema(filaInicial, colInicial,1); pr.mostrarTablero(); System.out.printf("Cantidad de veces que entra al ciclo: %,d %n", pr.contador); } }
no funciona este algoritmo esta mal implementado
ResponderBorrarGracias.... por el codigo lo probé y en ALGUNAS OCACIONES SE MATAN...0K.....
ResponderBorrarBuenos días
ResponderBorrarEl blog esta desactualizado y en mi opinión abandonado pero escribo esto para las nuevas personas.
El código mostrado arriba no hace uso de las propiedades BackTracking(https://es.wikipedia.org/wiki/Vuelta_atr%C3%A1s)
El algoritmo BackTracking lo que hace es ir hacia delante y si no encuentra la solución vuelve hacia atras. Este código publicado nunca vuelve hacia atras.
Tenéis un mejor ejemplo en http://jmonda.com/blog_post.php?n=algoritmo-backtracking-nreinas y mas ejemplos sobre BackTracking en http://jmonda.com/tags.php?tags=backtracking
Saludos.
vapormax
ResponderBorrarhermes bag
nike air max
yeezys
birkin bag
adidas gazelle sale
golden goose
yeezy shoes
jordan shoes
jordan retro
xiaofang20191218
jsyind718sx
ResponderBorrargolden goose outlet
golden goose outlet
golden goose outlet
golden goose outlet
golden goose outlet
golden goose outlet
golden goose outlet
golden goose outlet
golden goose outlet
golden goose outlet