Поиск последовательности перемещений коня на шахматной доске из одной клетки в другую - Lisp

Узнай цену своей работы

Формулировка задачи:

Реализовать алгоритм решения задачи о поиске последовательности перемещений коня на шахматной доске размера m × n (например, 4 × 4 или 4 × 5) из заданной начальной клетки (нижняя левая клетка) в нее же, при этом надо побывать хотя бы по одному разу на всех остальных клетках доски... На форуме находила подобную задачу,но она делает проход не по всем клеткам...может кто сможет помочь...

Решение задачи: «Поиск последовательности перемещений коня на шахматной доске из одной клетки в другую»

textual
Листинг программы
#lang racket
 
(define (list-from-to a b)
    (define (go i l) (cond ((< i a) l) (else (go (- i 1) (cons i l))) ))
    (go b '()))
 
(define (elem x l) (cond ((null? l) #f) ((equal? x (car l)) #t) (else (elem x (cdr l)))))
 
(define (concat l) (cond ((null? l) '()) (else (append (car l) (concat (cdr l)))) ))
 
(define (knight m n)
    (define (exist-step a b c)
        (cond ((null? (cdr c)) #f)
              ((and (equal? a (car c)) (equal? b (cadr c))) #t)
              (else (exist-step a b (cdr c)))))
 
    (define (next-pos c)
        (define p (car c))
        (define s (filter (lambda (x) (and (<= 1 (car x) m) (<= 1 (cadr x) n)))
            (map (lambda (x) (list (+ (car p) (car x)) (+ (cadr p) (cadr x))))
                 '((2 1) (1 2) (-1 2) (-2 1) (-2 -1) (-1 -2) (1 -2) (2 -1)) )))
        (filter (lambda (x) (not (exist-step x p c))) s))
 
    (define (next-chains c) (map (lambda (x) (cons x c)) (next-pos c) ))
 
    (define field-ps (concat (map (lambda (x) (map (lambda (y) (list x y))
                               (list-from-to 1 n))) (list-from-to 1 m))))
    (define (full-chain? c)
        (and (equal? (car c) '(1 1)) (null? (filter (lambda (x) (not (elem x c))) field-ps))))
 
    (define (go c)
        (define n-c (next-chains c))
        (cond ((full-chain? c) (reverse c))
              ((null? n-c) '())
              (else (foldl (lambda (x a) (cond ((null? a) (go x)) (else a))) '() n-c)) ))
 
    (go '((1 1))))
 
(time (display (knight 11 13)) (newline))

Объяснение кода листинга программы

  1. Сначала определяется функция list-from-to, которая создает список чисел от a до b.
  2. Затем определяется функция elem, которая проверяет, есть ли элемент x в списке l.
  3. Далее определена функция concat, которая склеивает два списка в один.
  4. После этого определена функция knight, которая реализует поиск последовательности перемещений коня на шахматной доске из одной клетки в другую. Внутри этой функции определены следующие вспомогательные функции:
    • exist-step проверяет, существует ли на шахматной доске ход из клетки p в клетку c.
    • next-pos находит все возможные позиции, куда может сделать ход конь из текущей позиции c.
    • next-chains создает список цепочек ходов, начиная с текущей позиции c.
    • field-ps создает список всех возможных позиций на шахматной доске.
    • full-chain? проверяет, является ли цепочка ходов c полной (т.е. конь пришел из клетки (1 1) и вернулся обратно).
    • go реализует сам поиск последовательности перемещений коня.
  5. В конце кода вызывается функция knight с аргументами 11 и 13, которая начинает поиск последовательности перемещений коня на шахматной доске из клетки (11 13) и выводит результат на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы