Как мне сгенерировать набор допустимых декартовых путей в Racket? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь сгенерировать набор всех возможных действительных путей позиций в плоскости 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)))))
...