0

我正在尝试制作一个检查块以确保没有数字重复的求解器。不幸的是,我无法得到正确的逻辑,我不确定我做错了什么。这是我所拥有的:

不太清楚为什么这不起作用。这是我的代码。

bool sudoku :: check_if_non_repeat(int r, int c, int v) //where r=row, c=column, v=value

知道为什么这不起作用吗?我只是得到无限循环

4

3 回答 3

1
if (!(j = brow && k == bcol)) 

Check that j=.... should be ==

于 2013-11-06T19:22:11.307 回答
1

我不确定你试图做什么,但我会这样做:

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;
于 2013-11-06T19:29:02.523 回答
0

我将告诉你解决问题的不同方法。很久以前我做了一个完整的求解器,它基本上使用了相反的方法。

对于每个字段,我都有一个std::bitset<9>,它告诉我在该字段中哪些值仍然是可能的。然后,每次插入都会更新同一行、列和框中的其他字段以消除这种可能性,当其中任何一个字段只剩下一个选项时,递归地填写后续字段。

如果它随后尝试填写一个不再允许的数字,则最后输入的数字不再是该位置的有效数字。这也是比您在此处进行的更彻底的检查:您不会检查是否关闭了同一行/列/框中另一个字段的最后一种可能性,更不用说其他字段了。

我从来没有做过几个有计划的优化,但即使没有它们,它也优于我朋友的求解器(>50 秒)(太快注意到)。主要是因为他有像你一样的代码。

于 2013-11-06T20:13:35.923 回答