Java数独求解器输出

时间:2012-12-03 21:08:08

标签: java

我的Sudoku Solver遇到了一些我需要做的问题,我应该做的是创建一个程序来检查输入的Sudoku难题是否正确。我有代码检查每行,列和“minibox”是否工作。我现在唯一的问题是打印拼图。这就是我到目前为止所做的:

public String printGrid(int size, int[][] puzzle){
    double temp = Math.sqrt(size);

    for(int row = 0; row < size; row++){
        for(int column = 0; column < size; column++){
            System.out.print(puzzle[row][column]);

            if(column == temp - 1) {
                System.out.print("|");   
            }

            if(row == temp - 1){
                for(int i = 0; i < size; i++){
                    System.out.print("-\t");
                }
            }

            if(column == size - 1) {
                column = 0;
                row++;
            }
        }
    }
    return "Correct!";
}

作为示例,大小将为4,输入的数据将为:

 1 2 3 4
 4 3 2 1 
 3 4 1 2
 2 1 4 3

我的输出如下:

 1 2 | 3 4
 4 3 | 2 1
 ----+----
 3 4 | 1 2
 2 1 | 4 3

我当前的代码会给出一个ArrayOutOfBounds错误并输出:

 -  2-  -   -   -   1-  -   -   -   4|121|43

我完全迷失了如何编写这种方法来输出,有人能为我解释一下吗? (也忽略了所有sudokus都返回“正确!”的事实。我应该能够自己解决这个问题。)

2 个答案:

答案 0 :(得分:3)

if(column == size - 1) {
    column = 0;
    row++;
}

使用上面的if-statement,你不要让内循环得到terminated,因为每当column值到达死胡同时,你就是resetting它到0,因此内循环(column < size)的终止条件将始终为真,并且您也会连续增加row值,这将逐渐导致ArrayIndexOutOfBounds。< / p>

只需移除if条件即可。这不是必需的。

答案 1 :(得分:1)

我现在至少有4个问题:

  1. 您不在外部(row)循环结束时打印换行符
  2. if(row == temp - 1)循环应仅在外部循环中(您希望在其自己的行上执行此操作,而不是每次都在列中
  3. column == temp-1等仅适用于2x2案例,应为column > 0 && column % temp == 0
  4. 永远不要修改循环中的for循环变量,这会使所有内容混淆,并且通常会导致ArrayIndexOutOfBoundsException,如此处所示。