我在阅读这里发布的问题: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; }
这个想法是,它将检测值数组中的重复项;但是我不知道多少让我不知所措。谁可以给我解释一下这个?
编辑:谢谢大家。如此众多的答案,我不知道该如何选择。现在,它很有意义。
真是个好主意。
基本上,它使用int标志(最初设置为零)作为“位数组”;对于每个值,它都会检查标志中的相应位是否已设置,如果未设置,则对其进行设置。
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; }