bool backtrack(int k)
{
if (k >= bt.size())
return true;
int i = bt[k].first;
int j = bt[k].second;
// fast path - only 1 possibility
if (cells[i][j].value)
return backtrack(k + 1);
auto constraints = cells[i][j].constraints;
// slow path >1 possibility.
// making snapshot of the state
array<array<cell,9>,9> snapshot(cells);
for (int v = 1; v <= 9; v++) {
if (!constraints[v]) {
if (set(i, j, v)) {
if (backtrack(k + 1))
return true;
}
// restoring from snapshot,
cells = snapshot;
}
}
return false;
}
我如何在Python中完成同样的事情?现在我有这个,但它不起作用。我正在进行深层复制,但仍然没有给出相同的答案。 这里的单元格是Cell实例的2D数组
def backtrack(self, k, bt, cells):
if k == len(bt):
return True
i = bt[k][0]
j = bt[k][1]
if cells[i][j].value:
return self.backtrack(k+1, bt, cells)
constraints = list(cells[i][j].constraints)
deepcop = copy.deepcopy(cells)
for v in range(1, 10):
if not constraints[v]:
if self.set(i, j, v, cells):
if self.backtrack(k + 1, bt, cells):
return True
cells = deepcop
return False
编辑:我添加了完整的功能。 C ++使用全局变量,而我在Python中传递参数。 bt
是C ++中对对象的数组,它是Python中的元组数组。
答案 0 :(得分:0)
这两个程序并不相同。在C ++版本中,这一行:
cells = snapshot;
将全局变量cells
标识的对象替换为局部变量snapshot
标识的对象。
在Python版本中,这一行:
cells = deepcop
将 local 变量cells
标识的对象替换为本地变量deepcop
标识的对象。
两种语言在处理函数参数方面非常相似。函数参数仅在函数体内作用域,并且任何函数都不能使调用范围中的对象被替换为另一个。 (当参数是具有内部状态的对象时,该状态当然可以在函数体内更改。)
由于您正在使用Python类中定义的函数(使用self
变量),因此请考虑将cells
作为成员变量。