我正在尝试创建一个快速的数独求解器,并在其中一个步骤,我需要保存拼图的状态 . 我开始使用各种深度复制功能来做到这一点,但发现它很慢 . 最后我提出了这两个功能,但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
Update: (additional info was requested!)
因此, cells
中的每个单元格代表数独网格上的一个正方形 . 一旦确定了单元格的值,就会设置 value
属性(否则为 nil
) . domain
是包含所有可能值的表 . 在对 backupCells
和 restoreCells
的调用之间完成了正向检查,并且单元格的值/域发生了很大变化 - serial
不会发生任何此类更改 .
通常,恢复是“撤消”,以便解算器可以猜测另一个值并从那里进行前向检查 .
1 回答
我的建议:
简化您的单元格布局 .
每个单元格始终是包含所有可能值的表,因此:
如果
not t[1]
,我们显然犯了一个错误 .否则,如果
not t[2]
,t[1]
是单元格的值 .否则,
t
包含多种可能性 .因此,您可以复制这样的板:
接下来,你扔掉旧板,只需使用(克隆)已保存的板 .