;; Enter your code here. Read input from STDIN. Print output to STDOUT (defvar *n* nil) (defvar *init* nil) (defvar *end* nil) (defvar *res* nil) (defvar *arr* nil) (defvar *visited* nil) (defmacro ur (i j) `(and (>= ,i 2) (< ,j (1- *n*)) (list (- ,i 2) (1+ ,j) 'UR))) (defmacro ul (i j) `(and (>= ,i 2) (>= ,j 1) (list (- ,i 2) (1- ,j) 'UL))) (defmacro r (i j) `(and (< ,j (- *n* 2)) (list ,i (+ ,j 2) 'R))) (defmacro l (i j) `(and (>= ,j 2) (list ,i (- ,j 2) 'L))) (defmacro lr (i j) `(and (< ,i (- *n* 2)) (< ,j (1- *n*)) (list (+ ,i 2) (1+ ,j) 'LR))) (defmacro ll (i j) `(and (< ,i (- *n* 2)) (>= ,j 1) (list (+ ,i 2) (1- ,j) 'LL))) (defun moves (i j) (delete nil (list (ul i j) (ur i j) (r i j) (lr i j) (ll i j) (l i j)))) (defmacro visitedp (elt) `(gethash ,elt *visited*)) (defun game-reset () (clrhash *visited*) (setq *res* nil)) (defun game-end-p (lst num &optional end) (when end (setq *end* end)) (when (equal lst *init*) (game-reset)) (cond ((null lst) nil) ((atom (car lst)) (if (equal (subseq lst 0 1) *end*) (list num (nreverse *res*)) (unless (visitedp lst) (setf (visitedp lst) lst) (unless (equal lst *init*) (push (car (last lst)) *res*)) (game-end-p (moves (car lst) (cadr lst)) (incf num))))) (t (or (and (member *end* (mapcar #'butlast lst) :test #'equal) (let ((dir (car (last (find-if (lambda (x) (equal *end* (butlast x))) lst))))) (push dir *res*) (list num (nreverse *res*)))) (game-end-p (car lst) num) (and (setf num 0) (setf *res* nil) nil) (game-end-p (cdr lst) num))))) (let ((n (read))) (let ((x1 (read)) (x2 (read)) (y1 (read)) (y2 (read))) (setq *init* (list x1 x2)) (setq *end* (list y1 y2))) (setq *n* n) (setq *visited* (make-hash-table :size (* n n) :test #'equal)) (setq *arr* (make-array *n*)) (let ((res (game-end-p *init* 0))) (if res (progn (format t "~d~%" (car res)) (dolist (elt (cadr res)) (format t "~a " elt))) (format t "Impossible"))))