15.15
(Ocho reinas) Un buen acertijo para los fanáticos del ajedrez es el problema de las Ocho reinas, que se describe
a continuación: ¿es posible colocar ocho reinas en un tablero de ajedrez vacío, de forma que ninguna reina “ataque” a
otra (es decir, que no haya dos reinas en la misma fi la, en la misma columna o a lo largo de la misma diagonal)? Por
ejemplo, si se coloca una reina en la esquina superior izquierda del tablero, no pueden colocarse otras reinas en ninguna
de las posiciones marcadas que se muestran en la fi gura 15.23. Resuelva el problema mediante el uso de recursividad.
[
Sugerencia: su solución debe empezar con la primera columna y buscar una ubicación en esa columna, en donde pueda
colocarse una reina; al principio, coloque la reina en la primera fi la. Después, la solución debe buscar en forma recur-
siva el resto de las columnas. En las primeras columnas, habrá varias ubicaciones en donde pueda colocarse una reina.
Tome la primera posición disponible. Si se llega a una columna sin que haya una posible ubicación para una reina, el
programa deberá regresar a la columna anterior y desplazar la reina que está en esa columna hacia una nueva fi la. Este
proceso continuo de retroceder y probar nuevas alternativas es un ejemplo de la “vuelta atrás” recursiva].
15.16
(Imprimir un arreglo) Escriba un método recursivo llamado
imprimirArreglo
, que muestre todos los elemen-
tos en un arreglo de enteros, separados por espacios.
15.17
(Imprimir un arreglo al revés) Escriba un método recursivo llamado
cadenaInversa
, que reciba un arreglo de
caracteres que contenga una cadena como argumento, y que la imprima al revés. [
Sugerencia: use el método
String
llamado
toCharArray
, el cual no recibe argumentos, para obtener un arreglo
char
que contenga los caracteres en el
objeto
String
.]
15.18
(Buscar el valor mínimo en un arreglo) Escriba un método recursivo llamado
minimoRecursivo
, que determi-
ne el elemento más pequeño en un arreglo de enteros. Este método deberá regresar cuando reciba un arreglo de un
elemento.
15.19
(Fractales) Repita el patrón del fractal de la sección 15.8 para formar una estrella. Empiece con cinco líneas en
vez de una, en donde cada línea es un pico distinto de la estrella. Aplique el patrón del “fractal Lo” a cada pico de la
estrella.
15.20
(Recorrido de un laberinto mediante el uso de la “vuelta atrás” recursiva) La cuadrícula que contiene caracteres
# y
puntos (
.
) en la fi gura 15.24 es una representación de un laberinto mediante un arreglo bidimensional. Los caracteres
#
representan las paredes del laberinto, y los puntos representan las ubicaciones en las posibles rutas a través del laberinto.
Sólo pueden realizarse movimientos hacia una ubicación en el arreglo que contenga un punto.
Escriba un método recursivo (
recorridoLaberinto
) para avanzar a través de laberintos como el de la fi gura
15.24. El método debe recibir como argumentos un arreglo de caracteres de 12 por 12 que representa el laberinto, y
la posición actual en el laberinto (la primera vez que se llama a este método, la posición actual debe ser el punto de
entrada del laberinto). A medida que
recorridoLaberinto
trate de localizar la salida, debe colocar el carácter
x
en cada
posición en la ruta. Hay un algoritmo simple para avanzar a través de un laberinto, que garantiza encontrar la salida
(suponiendo que haya una). Si no hay salida, llegaremos a la posición inicial de nuevo. El algoritmo es el siguiente: par-
tiendo de la posición actual en el laberinto, trate de avanzar un espacio en cualquiera de las posibles direcciones (abajo,
derecha, arriba o izquierda). Si es posible avanzar por lo menos en una dirección, llame a
recorridoLaberinto
en for-
ma recursiva, pasándole la nueva posición en el laberinto como la posición actual. Si no es posible avanzar en ninguna
dirección, “retroceda” a una posición anterior en el laberinto y pruebe una nueva dirección para esa posición. Programe
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Figura 15.23
| Eliminación de posiciones al colocar una reina en la esquina superior izquierda de un tablero de
ajedrez.
Ejercicios
683
15_MAQ_CAP_15_DEITEL.indd683
4/19/081:29:09AM