;;; (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)