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