Я пытаюсь сгенерировать набор всех возможных действительных путей позиций в плоскости x-y, в которых существующие точки могут стать частью пути, если:
- Точка делит либо свою координату x, либо координату y с другой любой другой точкой пути.
- Путь должен возвращаться к точке, с которой начался путь
- Если следующий край пути находится в том же направлении, что и последний край, края объединяются.
Код, который у меня есть, в основном изменил обычную функцию объединения, которая создает список всех возможных комбинаций определенного размера. Я хочу либо сохранить генерацию пути как есть, и создать другую функцию, которая проверяет каждый путь (удаляя недействительные из списка), или изменить генерацию пути так, чтобы ограничить создание путей так, чтобы только действительные создано.
(define-struct point (x y c u))
(define coordinates
(list (make-point 0 0 6 0)
(make-point 0 1 8 25)
(make-point 0 2 10 125)
(make-point 1 0 7 0)
(make-point 1 1 11 0)
(make-point 1 2 11 175)
(make-point 2 0 4 200)
(make-point 2 1 5 75)
(make-point 2 2 12 0)))
(define (apply-list fct L)
(if (null? L)
'()
(cons (fct (car L))
(apply-list fct (cdr L)))))
(define (prefix_path p L)
(apply-list (lambda(e) (cons p e)) L))
(define (generate_paths dim coords)
(cond
[(= dim 0) '(())]
[(null? coords) '()]
[else
(append (prefix_path (car coords)
(generate_paths (- dim 1) (cdr coords)))
(generate_paths dim (cdr coords)))]))
(define (valid_edge? x y)
(if (or (= (point-x x) (point-x y))
(= (point-y x) (point-y y)))
#t
#f)
(define (print_path path)
(if (null? path)
(display "EOP")
(let ([step (car path)])
(display (point-x step))
(display ", ")
(display (point-y step))
(display ", ")
(display (point-c step) )
(display ", ")
(display (point-u step))
(display #\newline)
(print_path (cdr path)))))