sicp每日一题[2.42]
1.sicp每日一题[1.42]2.sicp每日一题[1.43]3.sicp每日一题[1.44]4.sicp每日一题[1.45]5.sicp每日一题[1.46]6.sicp每日一题[2.1]7.sicp每日一题[2.2]8.sicp每日一题[2.3]9.sicp每日一题[2.4]10.sicp每日一题[2.5]11.sicp每日一题[2.6]12.sicp每日一题[2.7]13.sicp每日一题[2.8]14.sicp每日一题[2.9]15.sicp每日一题[2.11]16.sicp每日一题[2.10]17.sicp每日一题[2.12]18.sicp每日一题[2.13-2.16]19.sicp每日一题[2.17]20.sicp每日一题[2.18]21.sicp每日一题[2.19]22.sicp每日一题[2.20]23.sicp每日一题[2.21]24.sicp每日一题[2.22-2.23]25.sicp每日一题[2.24-2.27]26.sicp每日一题[2.28]27.sicp每日一题[2.29]28.sicp每日一题[2.30]29.sicp每日一题[2.31]30.sicp每日一题[2.32]31.sicp每日一题[2.33]32.sicp每日一题[2.34]33.sicp每日一题[2.35]34.sicp每日一题[2.36-2.37]35.sicp每日一题[2.38-2.39]36.sicp每日一题[2.40]37.sicp每日一题[2.41]
38.sicp每日一题[2.42]
39.sicp每日一题[2.43]40.sicp每日一题[2.44]41.sicp每日一题[2.45]42.sicp每日一题[2.46]43.sicp每日一题[2.47]44.sicp每日一题[2.48]45.sicp每日一题[2.49]46.sicp每日一题[2.50]47.sicp每日一题[2.51]48.sicp每日一题[2.52]49.sicp每日一题[2.53-2.55]50.sicp每日一题[2.56]51.sicp每日一题[2.57]52.sicp每日一题[2.58]53.sicp每日一题[2.59]54.sicp每日一题[2.60]55.sicp每日一题[2.61]56.sicp每日一题[2.62]57.sicp每日一题[2.63-2.64]58.sicp每日一题[2.65]59.sicp每日一题[2.66]60.sicp每日一题[2.67-2.68]61.sicp每日一题[2.69]62.sicp每日一题[2.70]63.sicp每日一题[2.71]64.sicp每日一题[2.72]65.sicp每日一题[2.73]66.sicp每日一题[2.74]67.sicp每日一题[2.75]68.sicp每日一题[2.76]69.sicp每日一题[2.77]70.sicp每日一题[2.78]71.sicp每日一题[2.79]72.sicp每日一题[2.80]73.sicp每日一题[2.81]74.sicp每日一题[2.82]75.sicp每日一题[2.83]76.sicp每日一题[2.84]77.sicp每日一题[2.85-2.86]这道题太难了,我自己只完成了 empty-board 这一个定义,其他的函数即使看了别人的答案也研究了半天才搞明白。。
; board-size 指的是正方形棋盘的长
(define (queens board-size)
(define (queen-cols k)
(if (= k 0)
(list empty-board)
(filter
(lambda (positions) (safe? k positions)) ; 每组位置不冲突的皇后的位置构成一个位置的集合
(flatmap
(lambda (rest-of-queens) ; rest-of-queens 表示已经被放置在安全位置的 k-1 个王后的位置的组合
(map (lambda (new-row)
(adjoin-position new-row k rest-of-queens))
(enumerate-interval 1 board-size))) ; 把第 k 列的新位置加进之前的王后的位置组合
(queen-cols (- k 1))))))
(queen-cols board-size))
(define empty-board nil)
; 检查2个位置坐标是否冲突
; 同行比较好判断,只要新王后位置的行跟前 k-1 个王后的行都不同就行,同列同理
; 对角线比较复杂,分为从左上到右下和从左下到右上两类
; 从左上到右下,在同一条对角线上的坐标,行与列坐标之差相同
; 从左下到右上,在同一条对角线上的坐标,行与列坐标之和相同
(define (check pos1 pos2)
(let ((x1 (car pos1))
(y1 (cadr pos1))
(x2 (car pos2))
(y2 (cadr pos2)))
(and (not (= x1 x2))
(not (= y1 y2))
(not (= (- x1 x2) (- y1 y2)))
(not (= (+ x1 x2) (+ y1 y2))))))
; 检查新加入的王后的位置与其他王后的位置是否冲突
; k 其实没有任何作用
(define (safe? k positions)
(let ((new-queen (car positions))
(rest-of-queens (cdr positions)))
(accumulate (lambda (pos result)
(and (check pos new-queen)
result))
true
rest-of-queens)))
; 在已有前 k-1 个王后的位置组合的基础上,把某个位置坐标(row col)加到第一个位置
(define (adjoin-position row col rest-of-queens)
(cons (list row col) rest-of-queens))
(queens 1)
(queens 2)
(queens 3)
(queens 4)
(queens 8)
; 执行结果
'(((1 1)))
'()
'()
'(((1 4) (3 3) (4 2) (2 1)) ((1 4) (4 3) (2 2) (3 1)) ((2 4) (3 3) (1 2) (4 1)) ((3 4) (1 3) (2 2) (4 1)))
'(((1 8) (2 7) (6 6) (3 5) (5 4) (7 3) (8 2) (4 1))
((1 8) (2 7) (4 6) (6 5) (7 4) (3 3) (8 2) (5 1))
((1 8) (2 7) (6 6) (3 5) (7 4) (4 3) (8 2) (5 1))
((1 8) (2 7) (7 6) (3 5) (4 4) (6 3) (8 2) (5 1))
((1 8) (3 7) (4 6) (5 5) (7 4) (2 3) (8 2) (6 1))
((1 8) (4 7) (2 6) (7 5) (5 4) (3 3) (8 2) (6 1))
((1 8) (5 7) (2 6) (4 5) (7 4) (3 3) (8 2) (6 1))
((1 8) (3 7) (7 6) (2 5) (4 4) (5 3) (8 2) (6 1))
((1 8) (2 7) (4 6) (5 5) (8 4) (6 3) (3 2) (7 1))
((1 8) (4 7) (2 6) (5 5) (6 4) (8 3) (3 2) (7 1))
((1 8) (3 7) (6 6) (2 5) (5 4) (8 3) (4 2) (7 1))
((1 8) (2 7) (4 6) (6 5) (8 4) (3 3) (5 2) (7 1))
((1 8) (2 7) (6 6) (3 5) (8 4) (4 3) (5 2) (7 1))
((1 8) (3 7) (6 6) (4 5) (2 4) (8 3) (5 2) (7 1))
((1 8) (6 7) (2 6) (3 5) (4 4) (8 3) (5 2) (7 1))
((1 8) (2 7) (4 6) (8 5) (5 4) (3 3) (6 2) (7 1))
((2 8) (4 7) (1 6) (5 5) (6 4) (7 3) (3 2) (8 1))
((3 8) (1 7) (6 6) (2 5) (5 4) (7 3) (4 2) (8 1))
((3 8) (1 7) (6 6) (4 5) (2 4) (7 3) (5 2) (8 1))
((2 8) (6 7) (1 6) (3 5) (4 4) (7 3) (5 2) (8 1))
((3 8) (1 7) (4 6) (5 5) (7 4) (2 3) (6 2) (8 1))
((2 8) (4 7) (1 6) (7 5) (5 4) (3 3) (6 2) (8 1))
((2 8) (5 7) (1 6) (4 5) (7 4) (3 3) (6 2) (8 1))
((3 8) (1 7) (7 6) (2 5) (4 4) (5 3) (6 2) (8 1))
((4 8) (1 7) (3 6) (5 5) (6 4) (2 3) (7 2) (8 1))
((2 8) (4 7) (5 6) (1 5) (6 4) (3 3) (7 2) (8 1))
((4 8) (1 7) (5 6) (2 5) (6 4) (3 3) (7 2) (8 1))
((5 8) (1 7) (2 6) (4 5) (6 4) (3 3) (7 2) (8 1))
((2 8) (3 7) (6 6) (4 5) (1 4) (5 3) (7 2) (8 1))
((2 8) (4 7) (6 6) (1 5) (3 4) (5 3) (7 2) (8 1))
((4 8) (1 7) (6 6) (2 5) (3 4) (5 3) (7 2) (8 1))
((2 8) (6 7) (3 6) (1 5) (4 4) (5 3) (7 2) (8 1)))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?