vorige zurück
;;;                                                (8 Damen neu.scm)
;;;
;;; Gute HG+T
;;; -----------------------------------------------------------------
(require-library "breakpoint.scm")
(define max-Zahl 8)

;;; ===== Nachfolger ================================================
; Die Nachfolgerfunktion.
(define
  (Nachfolger zustand)
  (let loop
    ((index max-Zahl)
     (akku ()))
    (cond
      ((zero? index) akku)
      ((member index zustand) (loop (sub1 index) akku))
      ((diagonal-besetzt? (cons index zustand))
       (loop (sub1 index) akku))
      (else
       (loop (sub1 index) (cons (cons index zustand) akku))))))

;;; ===== diagonal-besetzt? =========================================
; Testet die Diagonalen.
(define
  (diagonal-besetzt? zustand)
  (let loop
    ((liste (cdr zustand))
     (rauf (add1 (car zustand)))
     (runter (sub1 (car zustand))))
    (cond
      ((null? liste) #f)
      ((= rauf (car liste)) #t)
      ((= runter (car liste)) #t)
      (else
       (loop (cdr liste) (add1 rauf) (sub1 runter))))))

;;; ===== Tiefensuche ===============================================
(define
  (Tiefensuche)

  (let
      t-s
    ((Alternativen (Nachfolger ()))
     (besucht ()))
    (cond

      ((= (length besucht) max-Zahl)
       (Darstellung (car besucht))
       (car besucht))

      ((null? Alternativen) #f)

      ((member (car Alternativen) besucht)
       (t-s
        (cdr Alternativen)
        besucht))

      ((t-s
        (Nachfolger (car Alternativen))
        (cons (car Alternativen) besucht)))

      (else
       (t-s
        (cdr Alternativen)
        besucht)))))

;;; ===== Darstellung ===============================================
(define
  (Darstellung Damen)
  (let loop
    ((Anzahl (length Damen))
     (Damen Damen))
    (cond
      ((null? Damen) (newline))
      (else
       (stelle-Zeile-dar Anzahl (car Damen))
       (loop Anzahl (cdr Damen))))))

;;; ===== stelle-Zeile-dar ==========================================
(define
  (stelle-Zeile-dar Anzahl Spalte)
  (let loop
    ((Index 1))
    (cond
      ((> Index Anzahl) (newline))
      ((= Index Spalte)
       (display " D ")
       (loop (add1 Index)))
      (else
       (display " * ")
       (loop (add1 Index))))))

;;; =================================================================
(Tiefensuche)