Lisp董事会计数件

时间:2017-12-17 16:59:54

标签: function lisp common-lisp

我需要在lisp中创建一个函数来计算我的电路板中的部分。让我解释一下我的问题/游戏:

我有一个像这样的板子(10x10):

(
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
)

在这个委员会中,我们将代表两种类型的作品:

  • 1乘1平方
  • 2乘2平方

他们会像我这样定位在我的董事会中:

(
    (0 1 0 0 0 0 0 1 0 0)
    (0 0 0 0 0 0 0 0 0 0)
    (0 0 0 0 0 0 0 0 0 0)
    (0 0 0 1 1 0 0 0 0 0)
    (0 0 0 1 1 0 0 1 1 0)
    (0 0 0 0 0 0 0 1 1 0)
    (0 0 0 0 0 0 0 0 0 0)
    (0 0 0 0 0 0 0 0 0 0)
    (0 1 0 0 0 0 1 0 0 0)
    (0 0 0 0 0 0 0 0 0 0)
    )

在这个例子中,我有四个1乘1的正方形和两个2乘2的正方形。 我需要一个函数来计算我在我的电路板中有多少给定类型的片。

示例:

(defun countPiece (board pieceType)
   ; here I am supposed to write my code
)

所以如果我调用(countPiece (testBoard) 'twoByTwoSquare)它会返回2,例如,testboard是一个返回样本板的函数,其中有几个位置

然而,我不知道从哪里开始。任何提示?

编辑:水平或垂直都不能拼凑在一起。只在对角线

2 个答案:

答案 0 :(得分:1)

我不熟悉lisp,所以我的答案只会给你算法解决方案:

singlePieces = empty list
doublePieces = empty list

for each row
    for each column
        if ((value[row][column] = 1)
           and ((row - 1, column - 1) not in doublePieces)
           and ((row - 1, column) not in doublePieces)
           and ((row, column - 1) not in doublePieces)) then
            if ((row < rowCount)
               and (column < columnCount) and (value[row][column + 1] = 1)
               and (value[row + 1][column] = 1)
               and (value[row + 1][column + 1]) = 1) then
                doublePieces.add(row, column)
            else
                singlePieces.add(row, column)
            end if
        end if
    end for
end for

答案 1 :(得分:0)

以下是如何使用列表:

(defun count-pieces (board &aux (small 0) (big 0))
  (loop for (row next) on (cons nil board)
    for bigs = nil then
    (loop for (tl tr) on row
      for (bl br) on (or next (mapcar (constantly 0) row)
      for n from 0
      for nearly-bigp = (every #’plusp (list tl tr bl br))
      for bigp = nearly-bigp then (and nearly-bigp (not pbigp))
      and pbigp = nil then bigp
      for ninbig = (or (member n bigs) (and bigp (member (1+ n) bigs)))
      if (and ninbig bigp)
        collect n and collect (+ n 1)
        and do (incf big)
      else if ninbig do (incf small)))
  (values big small))

我在手机上写了这个,所以我不确定它是否有效。它也有点笨拙。它也可能值得使用数组而不是列表,因此它可能是值得的。用-1或2或3代表一个大块,以便它们可以很容易区分。