【发布时间】:2014-12-14 17:42:21
【问题描述】:
我正在尝试创建一个快速的数独求解器,并且在其中一个步骤中我需要保存拼图的状态。我开始使用各种深拷贝功能来做到这一点,但发现它很慢。最后我想出了这两个函数,但 luatrace 显示这两个函数仍然占用大量时间。
有什么可以优化的吗?或者是时候用 C 来写了?
local function backupCells(cells)
local serial = {{}, {}}
for i = 1, #cells do
serial[1][i] = {unpack(cells[i].domain)}
serial[2][i] = cells[i].value
end
return serial
end
local function restoreCells(cells, serial)
for i=1, #cells do
cells[i].domain = serial[1][i]
cells[i].value = serial[2][i]
end
end
更新:(要求提供更多信息!)
因此,cells 中的每个单元格代表数独网格上的一个正方形。一旦确定了单元格的值,就会设置value 属性(否则为nil)。 domain 是一个包含所有可能值的表。在对 backupCells 和 restoreCells 的调用之间,前向检查已完成,单元格的值/域发生了很大变化 - serial 不会引起任何此类变化。
通常,还原是一种“撤消”,因此求解器可以猜测另一个值并从那里进行前向检查。
【问题讨论】:
-
我不太确定为什么要按原样编写它们,对于任何有用的答案,需要
cells的确切布局(具有语义和基本原理)。同样有趣的是,在通话之间cells会发生什么,serial可能会发生什么。 -
我已经更新了帖子以包含一些关于数独求解器的额外信息!
标签: arrays optimization lua lua-table