на первом месте в записи фигуры у нас номер строки, на втором номер столбца.
т.е. если запись фигуры (x, y)
то ось X идёт с севера на юг, а Y c запада на восток
например, item = (5, 4)
чтобы найти его диагональных соседей, надо рассмотреть все элементы, полученные от item :
1) уменьшением x и y на единицу одновременно (пройтись на северо-восток): (4, 3) (3, 2) (2, 1)
2) увеличением x на единицу и уменьшением y на единицу одновременно (пройтись на юго-запад): (6, 3) (7, 2) (8, 1)
3) аналогично пройтись на северо-запад и юго-восток
если нигде не столкнемся с существущими ферзями, то возвращаем false, иначе true.
в данном случае во втором пункте мы столкнёмся с ферзём - найдем соседа (7,2)
"нигде не столкнёмся" мы реализуем так: в процессе поиска соседей будем добавлять их в список и если в конце он окажется пустым, то вернём false
на данном этапе напишем генератор всех возможных соседей для данного
item, процедура построения списка соседей будет выглядеть так:
1.
2.
3.
4.
5.
6.
7.
8.
(define (neighborhoods item min max direction)
(let ((x (car item))
(y (cadr item))
(x-operation (if (or (equal? direction "SE") (equal? direction "SW")) + -))
(y-operation (if (or (equal? direction "SE") (equal? direction "NE")) + -)))
(if (and (>= x min) (<= x max) (>= y min) (<= y max))
(cons item (neighborhoods (list (x-operation x 1) (y-operation y 1)) min max direction))
'())))