博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sicp学习 迷宫
阅读量:6530 次
发布时间:2019-06-24

本文共 2745 字,大约阅读时间需要 9 分钟。

很简单的问题,最笨的算法,自己第一个用scheme写的稍微算长点的程序.

废话不多说,直接上代码.

(begin    (load "ex2.scm")    (define (make-maze)    (define (for-each proc things)        (cond ((null? things) nil)              (else                    (let ((ret (proc (car things))))                    (if (null? ret) (for-each proc (cdr things)) ret)))))    ;迷宫    (define maze  '((1 1 1 1 1 1 1 1 1)                    (1 0 1 0 0 0 1 0 1)                    (1 0 1 0 1 0 1 0 1)                    (1 0 1 0 1 0 1 0 1)                    (1 0 0 0 0 0 0 0 1)                    (1 1 1 1 1 1 1 1 1)))    (define direction '((0 -1)(0 1)(-1 0)(1 0))) ;上下左右    (define (get-x-y array-2d x y)        (list-ref (list-ref array-2d x) y))    (define (is-close cur path);是否已经走过的路            (= 1 (accumulate                 (lambda (pos sum)                 (if (and (= (car pos) (car cur)) (= (cadr pos) (cadr cur))) (+ sum 1) sum))              0 path)))    ;检查是否合法路径    (define (check cur dir path)        (let ((x (+ (car dir) (car cur)))              (y (+ (cadr dir) (cadr cur))))         (cond ((is-close (list x y) path) nil)               ((= (get-x-y maze x y) 1) nil);阻挡               (else (list x y)))))   ;返回下一步合法的坐标        ;返回一条路径    (define (find-path-one start target)        (define (iter cur-step path)            (define (move dir)                (let ((next (check cur-step (list-ref direction dir) path)))                    (cond ((null? next) nil)                          (else (iter next (cons cur-step path))))))                                      (if (and (= (car target) (car cur-step))                     (= (cadr target) (cadr cur-step))) (cons cur-step path)                (for-each move (enumerate-interval 0 3)))             )        (reverse (iter start nil))    )    ;返回所有路径    (define (find-path-all start target)            (define (iter cur-step path)            (define (move dir)                (let ((next (check cur-step (list-ref direction dir) path)))                    (cond ((null? next) nil)                          (else (iter next (cons cur-step path))))))                                      (cond ((and (= (car target) (car cur-step)) (= (cadr target) (cadr cur-step)))                 (list (cons cur-step path))) ;到达目的地,返回路劲                  (else                      (accumulate (lambda (dir p) (append (move dir) p)) nil (enumerate-interval 0 3))))        )        (map reverse (iter start nil))    )    (lambda (op start target)        (cond ((eq? op 'find-path-all) (find-path-all start target))              ((eq? op 'find-path-one) (find-path-one start target))              (else "bad op"))    ))    );(define maze make-maze);(maze 'find-path-one '(1 1) '(1 7))

 

转载于:https://www.cnblogs.com/sniperHW/archive/2013/05/23/3095977.html

你可能感兴趣的文章
【Matplotlib】 标注一些点
查看>>
[AX]乐观并发控制Optimistic Concurrency Control
查看>>
自定义类加载器
查看>>
MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)
查看>>
C++构造函数例程
查看>>
把某一列值转换为逗号分隔字符串
查看>>
DLL,DML,DCL,TCL in Oracle
查看>>
SSE指令集学习:Compiler Intrinsic
查看>>
两种attach to process的方法
查看>>
WCF如何使用X509证书(安装和错误)(二)
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
查看>>
iOS中--NSArray调用方法详解 (李洪强)
查看>>
java异步操作实例
查看>>
Centos6.8防火墙配置
查看>>
JAVA多线程的问题以及处理【转】
查看>>
【Java面试题】10 abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?...
查看>>
如何新建UML2项目?详细操作步骤介绍
查看>>
[精讲17] 组策略
查看>>
控制流
查看>>
interlij的快捷键
查看>>