Created
February 5, 2019 21:15
-
-
Save 2624789/bafb064e4822514033506c9dfc7a2d61 to your computer and use it in GitHub Desktop.
Programa en Ruby que ubica ocho reinas en un tablero de ajedrez
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def ocho_reinas() | |
@reinas_en_tablero = [] | |
fila = 0 | |
columna = 0 | |
# hasta ubicar 8 reinas en el tablero | |
until @reinas_en_tablero.size == 8 | |
# si existe una reina en la fila o en una diagonal, se sigue con la otra fila | |
if reina_en_fila(fila) || reina_en_diagonal(fila, columna) | |
fila += 1 | |
# si no se pudo ubicar una reina en la columna | |
# se retira la última reina ubicada y se pone en la | |
# siguiente posición | |
while fila >= 8 | |
# ultima reina ubicada, siguiente fila, misma columna | |
fila = @reinas_en_tablero[-1][0] + 1 | |
columna = @reinas_en_tablero[-1][1] | |
p "Corrigiendo, borrada: #{@reinas_en_tablero.pop}" | |
end | |
else | |
# si no existe una reina en la fila o en diagonal, se pone una | |
ubicar_reina(fila, columna) | |
p "Ubicando reina en #{fila} #{columna}" | |
# se avanza a la siguiente columna | |
fila = 0 | |
columna += 1 | |
end | |
end | |
@reinas_en_tablero | |
end | |
def reina_en_fila(fila) | |
@reinas_en_tablero.find { |f, c| f == fila } | |
end | |
def reina_en_diagonal(fila, columna) | |
diagonales = | |
diagonal_derecha_arriba_para(fila, columna) + | |
diagonal_izquierda_arriba_para(fila, columna) + | |
diagonal_izquierda_abajo_para(fila, columna) + | |
diagonal_derecha_abajo(fila, columna) | |
diagonales.any? { |f, c| @reinas_en_tablero.any? { |rf, rc| f == rf && c == rc } } | |
end | |
def ubicar_reina(fila, columna) | |
@reinas_en_tablero << [fila, columna] | |
end | |
def diagonal_derecha_arriba_para(fila, columna) | |
diagonales = [] | |
until fila == 8 || columna == 8 | |
diagonales << [fila += 1, columna += 1] | |
end | |
diagonales | |
end | |
def diagonal_izquierda_arriba_para(fila, columna) | |
diagonales = [] | |
until fila == 8 || columna == 0 | |
diagonales << [fila += 1, columna -= 1] | |
end | |
diagonales | |
end | |
def diagonal_derecha_abajo(fila, columna) | |
diagonales = [] | |
until fila == 0 || columna == 8 | |
diagonales << [fila -= 1, columna += 1] | |
end | |
diagonales | |
end | |
def diagonal_izquierda_abajo_para(fila, columna) | |
diagonales = [] | |
until fila == 0 || columna == 0 | |
diagonales << [fila -= 1, columna -= 1] | |
end | |
diagonales | |
end | |
def imprimir_tablero() | |
tablero = Array.new(8) { Array.new(8) { "." } } | |
@reinas_en_tablero.each { |queen| tablero[queen[0]][queen[1]] = "Q" } | |
tablero.map { |n| n.join("|") }.reverse | |
end | |
p ocho_reinas() | |
puts imprimir_tablero() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment