lema de las 8 reinas Este problema consiste en determinar si se pueden colocar 8 damas en un tablero de ajedrez de 64 casillas, de tal manera que no queden amenazadas. Si fuéramos a resolver este problema con fuerza bruta, tendríamos que analizar todas las ubicaciones posibles de 8 reinas en el tablero hasta que nos encontremos con una combinacin en la que nin!una reina esté amenazada o ha"amos realizado todas las ubicaciones posibles. #ara la colocacin de la primera dama ha" 64 casillas disponibles. $uando colocamos ésta, quedarían 6% casillas posibles para la se!unda dama. & así sucesiva " recursivamente hasta que lle!aríamos a un total de 'combinaciones( posibles de 64 ) 6% ) 6* ) 6+) 6 ) - ) -8 ) -/, para un total de * millones de combinaciones. combinaciones. 0na computadora mu" r1pida trabajando día " noche demoraría m1s de medio a2o solamente para obtener todas las combinaciones, eso sin analizarlas. #or lo que evidentemente esta esta es una solucin mu" costosa " puede mejorarse como se ver1 a continuacin. Sabemos que si podemos ubicar 8 reinas sin que se amenacen, entonces solo puede haber una reina por columna, "a que dos reinas en una misma columna estarían amenaz1ndose. #or tanto el al!oritmo de este problema consiste en3 + Si n es cero, entonces "a no quedan reinas por poner " el problema tiene solucin. * Se intenta ubicar una reina en cada columna de izquierda a derecha. % Se intenta colocar la reina en cada celda de la columna " se verifica si desde esta posicin se amenaza a las reinas ubicadas en las columnas a la izquierda. Si no se amenazan las reinas anteriores, entonces trataremos de colocar las reinas restantes en las columnas de la derecha 5aproimacin recursiva al caso base7. 4 Si nin!una celda de la columna satisface el paso %, no se puede ubicar una reina en la columna " se vuelve atr1s para intentar ubicar en otra posicin a la reina ubicada en la columna anterior. Si estamos en la primera columna, entonces el problema no tiene solucin.
ubicareinas+ ac9trac9in!. #roblema del laberinto Este método lo :nico que hace es verificar si se ha recibido un tablero correcto 5es cuadrado " tiene todas las celdas en false7. ;ue!o llama al método privado 0bica
ubicareinas* ac9trac9in!. #roblema del laberinto El método =menaza sería el encar!ado de verificar si se amenaza al!una otra dama, recorriendo el arra" de forma vertical, horizontal " dia!onal, a partir de la posicin >i , j?. =dem1s de implementar este método como ejercicio, puede mejorar un poco m1s el al!oritmo. @íjese que dos reinas no pueden ubicarse en la misma fila. uscar la salida en un laberinto =l menos para mi este problema es el ideal para demostrar el poder del bac9trac9in!. Se trata de encontrar la salida dentro de un laberinto. ;a estrate!ia a se!uir para salir de un laberinto es primeramente, eplorar hacia delante un posible camino " ver si conduce a una solucin. Si no conduce a una solucin, ha" que desandar el camino " volver atr1s para intentar con otro.
$onsidere un laberinto representado por un arra" rectan!ular 5bidimensional7 de bool, en el que una celda con valor false si!nifica que ha" un obst1culo por el que no se puede atravesar. & una celda con valor true es una celda por la que se puede pasar. El problema consiste por ejemplo en suponer que entramos por la celda en la posicin , " se quiere encontrar en camino hasta la posicin m,n donde m es la cantidad de filas del arra" " n la cantidad de columnas. #uede resolverse de i!ual forma si se empieza " se termina por otras celdas. El método $A Ba"Salida es el si!uiente3
ha"salida ac9trac9in!. #roblema del laberinto $omo se ha visto en los ejemplos anteriores, este primer método es el que se encar!a de llamar al otro método privado " recursivo de i!ual nombre. Ceamos ahora el cdi!o " lue!o lo comentamos.
ha"salida* ac9trac9in!. #roblema del laberinto
Empezamos desde la línea * donde se indica el caso base de la recursividad. D sea, si se ha lle!ado a la celda de salida " esta es true. espués comprobamos si estamos en una celda por la cual no se puede pasar, en caso de que no se pueda pasar retornamos false. Si se puede pasar por esa casilla, la ponemos en false para !arantizar que no pasaremos de nuevo por ella en caso que el camino no conduzca a una salida. ;ue!o, en las primas llamadas recursivas se intenta averi!uar si ha" salida desde las casillas vecinas " se retorna true en caso de encontrar la salida. Si se lle!a a la :ltima línea es porque desde nin!una de las celdas vecinas ha" salida, " por tanto no ha" salida desde la celda actual, por lo que se retorna false. El método Ba"Salida solamente nos dice si eiste o no salida del laberinto, pero no nos da la respuesta de cual es la salida, o sea, el camino a se!uir para lle!ar a la salida. Fntenta hacer un método Salida;aberinto que devuelva un arra" con los puntos por los que se debe pasar para lle!ar a la salida mas corta. En este caso para estar se!uros de encontrar el camino m1s corto, habría que eplorar todos los caminos posibles " compararlos. Gote que en el método Ba"Salida, primero se eplora el camino que va en direccin dia!onal " lue!o los caminos m1s cercanos a esta, lo cual no quiere decir que se encuentre el camino m1s corto. Esto es lo que se conoce como heurística, que consiste en mejorar los al!oritmos basados en la eperiencia, el conocimiento " el sentido com:n. Solo a!re!ar que esta técnica de bac9trac9in! o Cuelta =tr1s, es mu" utilizada en jue!os, "a que ante una determinada situacin del jue!o se eploran los diferentes caminos a se!uir se!:n las posibles ju!adas del contrario " así sucesivamente, decidiendo las ju!adas, hasta que se conduce a la victoria. ueno, hasta aquí este peque2o tutorial de recursividad en $A. Se!uro faltaron muchas cosas por tratar en este tema, "a que no so" un eperto ni mucho menos. #ara aprender recursividad lo m1s importante es practicar, leer " copiar cdi!o. =quí dejo al!unos ejercicios. Si quieres lue!o debatimos las soluciones. +H Escriba un método recursivo strin! Fnvierte 5strin! s7 que devuelva el reverso de la cadena s. *H Fmplemente un método que demuestre que con un caballo se pueden recorrer todas las casillas de un tablero de ajedrez sin pasar dos veces por una misma casilla. %H Escriba el método static lon! @actorial5int n7 que devuelva el factorial del n:mero n. I J +, " para n K +, nI J n ) 5n +7I 4H Escriba el método static bool Es#alíndromo5strin! s7 que di!a si el strin! s es palíndromo. 0n strin! es palíndromo si se lee de la misma forma de izquierda a derecha que de derecha a izquierda.
-H Fmplemente el método static void escomposicionSumandos5int n7 que muestre en la pantalla todas las formas posibles de descomponer el n:mero n en sumandos. #or ejemplo, para nJ-, en la pantalla se muestra3 +++++ +++* +** ++% +4 *% 6H El Laista3 0n taista se desplaza en su tai por una ciudad en la cual slo est1 permitido conducir hacia el ESLE " hacia el S0<. Fmplemente el método static int $antidad$aminos5int Dri!, int "Dri!, int est, int "est7 que devuelva la cantidad de caminos diferentes por los que se puede lle!ar desde el punto 5Dri!, "Dri!7 hasta el punto 5est, "est7. =suma que est K Dri! " que "est K "Dri!.