我正在尝试创建一个快速的Sudoku解算器,并且在我需要保存拼图状态的其中一个步骤中。我开始使用各种深度复制功能来做到这一点,但发现它很慢。最后我想出了这两个函数,但是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
不会发生任何此类更改。
通常,恢复是“撤消”,以便解算器可以猜测另一个值并从那里进行前瞻检查。
答案 0 :(得分:0)
我的建议:
简化您的单元格布局。
每个单元格始终是包含所有可能值的表格,因此:
not t[1]
,我们显然犯了错误。not t[2]
,t[1]
是单元格的值。t
包含多种可能性。因此,你可以像这样复制一块电路板:
local function cloneBoard(cells)
local r = {}
for i = 1, #cells do
-- Option 1
local t, cell = {}, cells[i]
r[i] = t
for j = 1, #cell, 1 do
t[j] = cell[j]
end
-- Option 2
r[i] = {unpack(cells[i])}
-- Measure which option is faster for you
end
return r
end
接下来,你扔掉旧电路板,只需使用(克隆)已保存的电路板。