C++ 避免3x3网格C+的重复次数+;

C++ 避免3x3网格C+的重复次数+;,c++,logic,C++,Logic,我正在尝试制作一个解算器来检查块,以确保没有数字重复。不幸的是,我不能得到正确的逻辑在这方面,我不知道我做得不对。以下是我得到的: 不太清楚这为什么不起作用。这是我的密码 bool sudoku :: check_if_non_repeat(int r, int c, int v) //where r=row, c=column, v=value 你知道为什么这样不行吗?我只是得到了无限的循环 if (!(j = brow && k == bcol)) 检查j=。。。。应该

我正在尝试制作一个解算器来检查块,以确保没有数字重复。不幸的是,我不能得到正确的逻辑在这方面,我不知道我做得不对。以下是我得到的:

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

bool sudoku :: check_if_non_repeat(int r, int c, int v) //where r=row, c=column, v=value
你知道为什么这样不行吗?我只是得到了无限的循环

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

检查j=。。。。应该是
=

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

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;
}

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

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

如果它然后试图填充一个不再允许的数字,那么最后给出的输入就不再是该点的有效数字。这也是一个比您在这里做的更彻底的检查:如果您关闭了同一行/列/框中另一个字段的最后一个可能性,您就不会检查了,更不用说其他字段了


我从来没有做过几次有计划的优化,但即使没有它们,它也比我朋友的解算器(超过50秒)表现得更好(太快了以至于没注意到)。主要是因为他有和你一样的代码。

哎呀。抢手货尽管如此,它仍然不能正常工作。它正在报告错误的无效块。你知道为什么它仍然不起作用吗?这仍然不起作用,我尝试给它添加一些逻辑,但它没有起作用。@Mdjon26它到底起了什么作用?假阳性,假阴性,还是两者都有?这是一堆虚假的陈述。我尝试了if(rowcol[j][k]==v&&v!=0&&j!=r&&k!=c),但这没有返回任何结果。我希望程序忽略0,我不希望j==r和k==c,因为这是给定的数字。@Mdjon26如果您的逻辑有点不正确。当只需要其中一个行和列时,可以检查它们是否相等或不相等。我在答案中加了更好的形式。
            if (   sudoku_array[j][k] == v
                && v != 0
                && !(j == r && k == c)) 
                    return true;