El problema de las n reinas consiste en disponer n reinas en un tablero de ajedrez de forma que no se ataquen entre sí.
Si se representan las reinas mediante una lista que indica la altura de cada reina, la siguiente función chequea que las reinas no se atacan entre sí:
> noSeAtacan [] = success
> noSeAtacan (y:ys) = noAtaca (1,y) ys & noSeAtacan ys
> noAtaca (x,y) [] = success
> noAtaca (x,y) (y':ys) = y =/= y'
> & abs (y' - y) =/= x
> & noAtaca (x+1,y) ys
> abs x | x < 0 = -x
> | otherwise = x
Definir una función nReinas :: Int -> [Int] que genere una lista con las posiciones que deben tomar n reinas en un tablero de ajedrez sin que se ataquen entre sí.
?-nReinas 8
[5,2,6,1,7,4,8,3]
este algoritmo está en internet anexo la página suerte.
http://www.di.uniovi.es/~labra/PDec/.../ListasND.html