在LISP中存储棋盘的有效方法是什么?

时间:2016-05-09 11:37:21

标签: clojure

什么是在LISP中存储棋盘的有效方法,例如解决8-queens拼图?

2 个答案:

答案 0 :(得分:3)

对于8皇后问题,最有效的存储将是一个8字节的数组。 Clojure提供了byte-array方法来简化创建这样一个数组的过程。将每个字节视为8位数组,并使用0表示空方块,1表示空格。

如果您打算使用多种类型的棋子,这将无效;另外,如果你想要可变的电路板尺寸,你应该考虑不同的方法。

答案 1 :(得分:1)

为了有效地解决八个皇后问题,您正在寻找一种有效的方式来表示部分解决方案。

如果我们将排名和文件0编号为7,并逐步完成排名,则向量rank -> file执行此任务。

  • 队伍照顾好自己。
  • 免费文件是剩余的(set (range 8))
  • 自由上升的对角线是剩余的(set (range 15))
  • 自由落下的对角线是剩余的(set (range -7 8))

...其中,每个广场[i j]

  • ranki
  • filej
  • rising-diagonal(+ i j)
  • falling-diagonal(- i j)

您可以像@WolfeFan建议的那样,使用位集来存储空闲或占用的插槽。但有关存储在这两种表示中都可以忽略不计。哪种表示更快,我不会在乎猜测。