Inteligencia Artificial - algo se me escapa (N-reinas)

 
Vista:

algo se me escapa (N-reinas)

Publicado por Omar (2 intervenciones) el 04/12/2007 08:50:04
Ok, estoy resolviendo el problema de las n-reinas en lisp, mi enfoque es el siguiente: pong una reina en la columna 1, fila 2, de ahi, paso a la siguiente columna, fila 1, reviso si esta amenazada, si lo esta, paso a la siguiente casilla (hacia abajo, bajaria a la siguiente fila) hasta encontrar una casilla no amenazada, coloco una reina ahi, y paso a la siguiente columna, es una busqueda acotada, ya que la posicion de la primera reina, evita que se cicle infinitamente sin encontrar solucion (bueno, eso creo), el caso es que mi programa nada hacee, ya me cansé de buscar mi error, y no lo encuentro, alguien con buen ojo para lisp podría darle una checada? se los agradeceria eternamente, igual yo estaré revisandolo, pero si alguien experimentado puede ayudarme, que mejor, dejo el codigo para que lo vean:

;llamada a la funcion principal
(defun nreinas (N)
;(setf tablero (make-array `(,N ,N):initial-element 0))
(if (<= N 3) '(No hay solucion)
(resuelveI (make-array `(,N ,N):initial-element 0) N)
)
)

;llamada a la funcion que colocara la primera reina, y llamara al programa que
;comprobara las posiciones de las démas
(defun resuelveI (tablero N)
(setf (aref tablero 1 0) 1)
(resuelveT tablero N 0 1)
)

;funcion que encuentra una casilla no amenazada
(defun resuelveT (tablero N I K)
(if (eql I (- 1 N)) tablero
(if (amenazada tablero N I K) (resuelveT tablero N (+ 1 I) K)
(avanza tablero N I K)
)
)
)

;funcion que coloca una reina cuando una casilla esta disponible
(defun avanza (tablero N I K)
(setf (aref tablero I K) 1)
(resuelveT tablero N 0 (+ 1 k))
)

;funcion que comprueba si una casilla está amenazada o no, ayudada de otras funciones
(defun amenazada (tablero N I K)
(if (or (horizontal tablero I K)
(diagonalA tablero I K)
(diagonalD tablero N I K)
) t
nil
)
)

;funcion que comprueba la horizontal
(defun horizontal (tablero I K)
(if (> 0 K) nil
(if (eql 1 (aref tablero I K)) t
(horizontal tablero I (- 1 K))
)
)
)

;Funcion que comprueba la diagonal ascendente
(defun diagonalA (tablero I K)
(if (or (> 0 I)(> 0 K)) nil
(if (eql 1 (aref tablero I K)) t
(diagonalA tablero (- 1 I) (- 1 K))
)
)
)

;Funcion que comprueba la diagonal descendente
(defun diagonalD (tablero N I K)
(if (or (> 0 K) (> I N)) nil
(if (eql 1 (aref tablero I K)) t
(diagonalD tablero N (+ 1 I) (- 1 K))
)
)
)
ojala alguien pueda checarlo :S
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder