Skip to content

Instantly share code, notes, and snippets.

@2624789
Created February 5, 2019 21:15
Show Gist options
  • Save 2624789/bafb064e4822514033506c9dfc7a2d61 to your computer and use it in GitHub Desktop.
Save 2624789/bafb064e4822514033506c9dfc7a2d61 to your computer and use it in GitHub Desktop.
Programa en Ruby que ubica ocho reinas en un tablero de ajedrez
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