;;; (8ganzdoof.scm) ;;; ;;; Schlimmste Version, bei der alle Felder versucht werden, also ;;; einfachstes GENERATE AND TEST ;;; ;;; ----------------------------------------------------------------- (require-library "breakpoint.scm") (define max-Zahl 4) ;;; ===== Suchraum ================================================== (define Suchraum (let loop ((zeile max-Zahl) (spalte max-Zahl) (akku ())) (cond ((zero? zeile) akku) ((zero? spalte) (loop (sub1 zeile) max-Zahl akku)) (else (loop zeile (sub1 spalte) (cons (cons zeile spalte) akku)))))) ;;; ===== Nachfolger ================================================ ; Die Nachfolgerfunktion liefert hier einfach alle Felder, also den ; Suchraum. (define (Tiefensuche) (let t-s ((Alternativen Suchraum) (besucht ())) (cond ((and (= (length besucht) max-Zahl) (zulaessig? besucht (cdr besucht))) (begin (writeln besucht) besucht)) ((= (length besucht) max-Zahl) #f) ((null? Alternativen) #f) ((member (car Alternativen) besucht) (t-s (cdr Alternativen) besucht)) ((t-s Suchraum (cons (car Alternativen) besucht))) (else (t-s (cdr Alternativen) besucht))))) ;;; ===== zulaessig? ================================================ ; Es wird nacheinander geprueft, ob sich Zeilen- oder Spaltenindizes ; und Diagonalendifferenzen wiederholen. (define (zulaessig? L1 L2) (cond ((null? (cdr L1)) #t) ((null? L2) (zulaessig? (cdr L1) (cddr L1))) ((= (caar L1) (caar L2)) #f) ((= (cdar L1) (cdar L2)) #f) ((= (- (caar L1) (caar L2)) (- (cdar L1) (cdar L2))) #f) ((= (- (caar L1) (caar L2)) (- (cdar L2) (cdar L1))) #f) (else (zulaessig? L1 (cdr L2))))) ;;;============================================================== (Tiefensuche)