0

所以我的代码有点问题。假设要交叉检查相同整数的行和列。

这是我到目前为止所拥有的......但是当我运行它时,它似乎只检查第一个整数。(例如数独板的第一行读取。1 2 2 2 2 2 2 2 2 2)它不会检测到明显的倍数 2 但如果我将输入更改为 1 1 2 2 2 2 2 2 2 错误将会出现在这种情况下最多为多个 1。多个任何建议来调整我的循环以使其通过列?

public static void validate(final int[][] sudokuBoard) {
    int width = sudokuBoard[0].length;
    int depth = sudokuBoard.length;

    for (int i = 0; i < width; i++) {
            int j = i;
            int reference = sudokuBoard[i][j];

            while (true) {
                if ((j >= width) || (j >= depth)) {
                    break;
                } 
                else if (i == j){
                    // do nothing
                }
                else if (j < width) {
                    int current = sudokuBoard[i][j];

                    if (current == reference) {
                        System.out.print("Invalid entry found (width)" + "\n");
                        System.out.print(current + "\n");


                        // invalid entry found do something
                    }
                } else if (j < depth) {
                    // note reversed indexes
                    int current = sudokuBoard[j][i];

                    if (current == reference) {
                        System.out.print("Invalid entry found (depth)" + "\n");
                        System.out.print(current + "\n");

                        // invalid entry found do something
                    }
                }
                j++;
            }
4

3 回答 3

3

您的代码比应有的复杂。当您可以拆分为多个不同的函数时,为什么要将所有内容都放在一个函数中?

public static void Validate(final int[][] sudokuBoard)
{
    int width = sudokuBoard[0].length;
    int depth = sudokuBoard.length;

    for(int i = 0; i < width; i++)
        if(!IsValidRow(sudokuBoard, i, width))
        {
          //Do something - The row has repetitions
        }
    for(int j = 0; j < height; j++)
        if(!IsValidColumn(sudokuBoard, j, width))
        {
          //Do something - The columns has repetitions
        }
}

static bool IsValidRow(int[][] sudokuBoard, int referenceRow, int width)
{
    //Compare each value in the row to each other
    for(int i = 0; i < width; i++)
    {
        for(int j = i + 1; j < width; j++)
        {
            if(sudokuBoard[referenceRow][i] == sudokuBoard[referenceRow][j])
                return false
        }
    }
    return true;
}

static bool IsValidColumn(int[][] sudokuBoard, int referenceColumn, int height)
{
    //Compare each value in the column to each other
    for(int i = 0; i < height; i++)
    {
        for(int j = i + 1; j < height; j++)
        {
            if(sudokuBoard[i][referenceColumn] == sudokuBoard[j][referenceColumn])
                return false
        }
    }
    return true;
}

这样,您的代码就更易于维护/阅读。上面的代码尚未经过测试,但应该是正确的。

如果您不清楚,我建议逐步调试此代码以真正了解发生了什么。

于 2012-02-16T18:12:06.840 回答
0

鉴于数独的约束(一行 n 单元格必须仅包含数字 1-n),您不需要 n^2 顺序搜索(每行或每列),您可以通过保持一个位数组指示你见过哪些数字。这是检查行的伪代码,对列执行相同的操作:

for i in 0 to depth-1 // rows
  boolean seen[] = new seen[width];
  for j in 0 to width-1 // columns
    if seen[board[i][j]-1] == true
      duplicate number
    else
      seen[board[i][j]-1] = true
于 2012-02-16T18:19:30.053 回答
0

我会将功能分解为更小的布尔检查。这样,您可以逐行、逐列和逐平方验证。例如

private boolean isValidRow(int[] row) {
    // Code here to check for valid row (ie, check for duplicate numbers)
}

private boolean isValidColumn(int[] column) {
    // Code here to check for valid column
}

private boolean isValidSquare(int[][] square) {
    // Code here to check for valid square
}

请注意,行和列只需要传递一个一维数组。正方形是二维数组,因为您需要检查 3x3 区域。您还可以将这些方法视为static它们的功能独立于数独板实例。

编辑:关于行/列/方形验证的建议是使用 HashSet。集合只能有一个特定值的元素,因此您可以添加元素并查找失败。例如:

HashSet<Integer> hs = new HashSet<Integer>();
for(int i = 0; i < 9; i++) {
    if(!hs.add(integerArray[i])) // HashSet.add returns 'false' if the add fails 
                                 // (ie, if the element exists)
        return false;
}
return true;
于 2012-02-16T18:19:39.927 回答