我正在尝试制作一个检查块以确保没有数字重复的求解器。不幸的是,我无法得到正确的逻辑,我不确定我做错了什么。这是我所拥有的:
不太清楚为什么这不起作用。这是我的代码。
bool sudoku :: check_if_non_repeat(int r, int c, int v) //where r=row, c=column, v=value
知道为什么这不起作用吗?我只是得到无限循环
if (!(j = brow && k == bcol))
Check that j=.... should be ==
我不确定你试图做什么,但我会这样做:
bool sudoku :: check_if_non_repeat(int r, int c, int v) //where r=row, c=column, v=value
{
int brow = r/3;
int bcol = c/3;
for (int j = brow * 3; j < (brow * 3 + 3); j++)
for (int k = bcol * 3; k < (bcol * 3 + 3); k++)
if (sudoku_array[j][k] == v)
return true;
return false;
}
编辑:如下所述,if
声明需要更复杂:
if ( sudoku_array[j][k] == v
&& v != 0
&& !(j == r && k == c))
return true;
我将告诉你解决问题的不同方法。很久以前我做了一个完整的求解器,它基本上使用了相反的方法。
对于每个字段,我都有一个std::bitset<9>,它告诉我在该字段中哪些值仍然是可能的。然后,每次插入都会更新同一行、列和框中的其他字段以消除这种可能性,当其中任何一个字段只剩下一个选项时,递归地填写后续字段。
如果它随后尝试填写一个不再允许的数字,则最后输入的数字不再是该位置的有效数字。这也是比您在此处进行的更彻底的检查:您不会检查是否关闭了同一行/列/框中另一个字段的最后一种可能性,更不用说其他字段了。
我从来没有做过几个有计划的优化,但即使没有它们,它也优于我朋友的求解器(>50 秒)(太快注意到)。主要是因为他有像你一样的代码。