一尘不染

Sudoku有效性检查算法-此代码如何工作?

algorithm

我在阅读这里发布的问题:C#中的Sudoku算法

发布的解决方案之一就是这段代码。

public static bool IsValid(int[] values) {
        int flag = 0;
        foreach (int value in values) {
                if (value != 0) {
                        int bit = 1 << value;
                        if ((flag & bit) != 0) return false;
                        flag |= bit;
                }
        }
        return true;
}

这个想法是,它将检测值数组中的重复项;但是我不知道多少让我不知所措。谁可以给我解释一下这个?

编辑:谢谢大家。如此众多的答案,我不知道该如何选择。现在,它很有意义。


阅读 189

收藏
2020-07-28

共1个答案

一尘不染

真是个好主意。

基本上,它使用int标志(最初设置为零)作为“位数组”;对于每个值,它都会检查标志中的相应位是否已设置,如果未设置,则对其进行设置。

相反,如果该位位置已设置,则它知道已经看到了相应的值,因此Sudoku无效。

更详细:

public static bool IsValid(int[] values)
{
    // bit field (set to zero => no values processed yet)
    int flag = 0;
    foreach (int value in values)
    {
        // value == 0 => reserved for still not filled cells, not to be processed
        if (value != 0)
        {
            // prepares the bit mask left-shifting 1 of value positions
            int bit = 1 << value; 
            // checks if the bit is already set, and if so the Sudoku is invalid
            if ((flag & bit) != 0)
                return false;
            // otherwise sets the bit ("value seen")
            flag |= bit;
        }
    }
    // if we didn't exit before, there are no problems with the given values
    return true;
}
2020-07-28