Solution of Sertan Girgin


(define (where-can-i-go? wd board_size)
	(let* ((x (car wd)) (y (cadr wd))
		(u1 (- y 1)) (u2 (- y 2)) (d1 (+ y 1)) (d2 (+ y 2))
		(l1 (- x 1)) (l2 (- x 2)) (r1 (+ x 1)) (r2 (+ x 2))
		(valid (lambda (x y)
				 (if (and (> x 0) (> y 0) (<= x board_size) (<= y board_size)) (list (se x y)) '()))))
	(append (valid l1 u2) (valid r1 u2)
		(valid l2 u1) (valid r2 u1)
		(list wd)	
		(valid l2 d1) (valid r2 d1)
		(valid l1 d2) (valid r1 d2))
	))

(define (create-board visited board_size)
	(let ((limit (- (* board_size board_size) 1)))
	     (define (value i j)
		     (let ((this (se i j)))
			  (se (count (keep (lambda (x) (not (member x visited))) (where-can-i-go? this board_size))) this)
		     ))
	     (define (my-loop l)
		     (let* ((i (+ (remainder l board_size) 1)) (j (+ (quotient l board_size) 1))
			    (temp (value i j)))
		     	   (if (= l limit)
	 		       (insert temp '())
			       (insert temp (my-loop (+ l 1)))
			   )))
	(my-loop 0)
	)) 		  

(define (insert elem lst)
	(let ((this (car elem)))
	     (define (helper lst)
		     (if (null? lst)
		         (list elem)
		         (if (< (caar lst) this)
			     (cons elem lst)
			     (cons (car lst) (helper (cdr lst)))
			 )))
	     (if (= (car elem) 0)
	         lst
	         (helper lst)
	     )))

(define (fill-board visited board_size n_knights)
	(let ((newlist (create-board visited board_size)))
	     (if (null? newlist)
		 #t
		 (if (or (< (* n_knights 9) (- (* board_size board_size) (count visited))) (= n_knights 0))
		     #f
		     (there-exists? newlist
			            (lambda (x)
					    (let* ((this (cdr x))
						  (rest (fill-board (append visited (where-can-i-go? this board_size)) board_size (- n_knights 1))))
						 (if rest (cons this rest) #f))))))))

(define words '(a b c d e f g h i))

(define (convert lst)
	(if (pair? lst)
	    (let ((this (car lst)))
	         (se (word (item (car this) words) (cadr this)) (convert (cdr lst)))
            )
	    '()
        ))
 
(define (cover board_size n_knights)
        (let ((solution (fill-board '() board_size n_knights)))
	     (if solution (convert solution) '())
	))