【问题标题】:Java Sudoku Solver OutputJava 数独求解器输出
【发布时间】:2012-12-03 21:08:07
【问题描述】:

我的 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

我完全不知道如何编写这个方法来输出,谁能帮我解释一下? (也忽略所有数独都返回“正确!”的事实,我自己应该能够弄清楚。)

【问题讨论】:

  • 它在哪里给出Exception?我的意思是,哪一行?
  • java.lang.ArrayIndexOutOfBoundsException: 4 这是哪一行:System.out.print(puzzle[row][column]);

标签: java


【解决方案1】:
if(column == size - 1) {
    column = 0;
    row++;
}

使用上面的if-statement,你不会让内循环得到terminated,因为每次column值到达死胡同,你就是resetting它到0,因此内循环(column &lt; size) 的终止条件将始终为真,并且您正在不断增加row 的值,这将逐渐导致ArrayIndexOutOfBounds

只需删除 if 条件即可。不需要。

【讨论】:

  • 好吧,这解决了错误,但是它仍然没有以我想要的格式输出。
  • outer loop 中添加System.out.println() 作为最后一行以移至下一行。
  • @RohitJain 总是快速回答问题,干得好!很高兴在 Java 问题中不断看到你的名字 +1
  • @WilliamShatner .. 哈哈 :) 谢谢。相信我,从加入 SO 开始,我的知识水平至少提高了 30%。
  • 哈哈,你的答案总是很好,但你用反引号有点太多了。 terminated? resetting?
【解决方案2】:

你至少有 4 个我马上就发现的问题:

  1. 不要在外部 (row) 循环的末尾打印换行符
  2. if(row == temp - 1) 循环应该只在外循环中(你想在它自己的行上做,而不是每次都在列中
  3. column == temp-1 等仅适用于 2x2 情况,应为 column &gt; 0 &amp;&amp; column % temp == 0
  4. 永远不要修改循环内的for 循环变量,这会混淆一切,通常会导致ArrayIndexOutOfBoundsException,就像这里发生的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多