【问题标题】:Swap Elements in Lisp list在 Lisp 列表中交换元素
【发布时间】:2011-12-09 18:25:33
【问题描述】:

我正在尝试实现一个返回 LIST 列表的函数(LIST 中的每个列表都是在列表中交换的两个元素的结果)。它应该根据每次交换形成的列表进行搜索。这是我解决 8 谜题的程序的一部分。这是我到目前为止所拥有的

(setq *LIST* nil) 

(defun swapped_list(lst)
 (loop for j in (positions_to_swap) do
    (setq *LIST* (rotatef (nth pos lst) (nth j lst))
      *LIST*)

(swapped_list '(11 12 13 14 15 16 17 18 19))

如果positions_to_swap(0 2 5) 并且pos4,这应该返回 ((15 12 13 14 11 16 17 18 19) (11 12 15 14 13 16 17 18 19) (11 12 13 14 16 15 17 18 19))

我已经花费了无数个小时来尝试调试,但没有任何进展。我尝试了许多变体,但没有一个有效。

【问题讨论】:

  • 你说的是8皇后问题吗?如果是这种情况,您将使其变得更加困难(提示:-1-您当然知道皇后必须在不同的行上,因此只需使用列号向量-2-有8个可用列在开始时,每次放置皇后时,您都可以从可用列列表中删除该列 -3- 只有 15 条直接对角线 (dd=x+y),您可以使用相同的逻辑 -4- 只有15 个对角线 (cd=x+8-y),你可以再次使用相同的逻辑...)

标签: list lisp swap


【解决方案1】:

如果 position_to_swap 是 (0 2 5) 并且 pos 是 4,这应该返回 ((15 12 13 14 11 16 17 18 19) (11 12 15 14 13 16 17 18 19) (11 12 13 14 16 15 17 18 19))

(defun swap (list position positions-to-swap)
  (loop for position-to-swap in positions-to-swap
        for rotated-list = (copy-list list)
        do (rotatef (nth position rotated-list)
                    (nth position-to-swap rotated-list))
        collect rotated-list))

成功了:

CL-USER> (swap '(11 12 13 14 15 16 17 18 19) 4 '(0 2 5))
((15 12 13 14 11 16 17 18 19)
 (11 12 15 14 13 16 17 18 19)
 (11 12 13 14 16 15 17 18 19))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多