Sudoku Block Checker Java

时间:2013-04-24 20:52:59

标签: java runtime-error sudoku

我正在构建一个数独检查器,我已经制作了行检查器和列检查器。我目前正在尝试制作块检查器(3x3块)。对此的任何见解都会很棒。

public boolean checkBlock (int col0to2, int row0to2)
 {
   int [] tempArray = new int [3];
   for (int x=0; x<3; x++)
   {
     for (int y=0; y<3;y++)
      {
        if ((board [col0to2+x][row0to2+y]) > 0 && (board [col0to2+x][row0to2+y]) < 10)
        {
          int tempVal = board [col0to2+x][row0to2+y];
          tempArray [tempVal - 1] = tempVal; // i think this line is giving me the run 
                                            // error   
    }
  } 
}
 return true;
}

4 个答案:

答案 0 :(得分:1)

if ((board [col0to2+x][row0to2+y]) > 0 && (board [col0to2+x][row0to2+y]) < 10) {
      int tempVal = board [col0to2+x][row0to2+y];
      tempArray [tempVal - 1] = tempVal; // i think this line is giving me the run error

}

你对tempval的界限检查应该是1到9(含)。假设它是9.然后你分配tempArray [8] = 9.你遇到了一个问题,因为tempArray被初始化为一个包含3个元素的数组。

我想你想要这样的东西:

tempArray = new int[9]

和分配

tempArray[x*3 + y] = tempVal;

虽然我没有测试过,但基本上它用它找到的每个数字填充数组。

答案 1 :(得分:0)

由于您需要处理数字1-9,因此tempArray中需要9个整数的空间,但您声明它只有3个长整数。此外,您并没有真正检查是否使用了所有数字(并且没有重复)。

public boolean checkBlock (int col0to2, int row0to2) {
   int [] tempArray = new int [9];
   for (int x=0; x<3; x++) {
      for (int y=0; y<3;y++) {
         int tempVal = board [col0to2+x][row0to2+y];
         if (tempVal > 0 && tempVal < 10) {
            if (tempArray[tempVal - 1] != 0) {
               return false;
            }
            tempArray [tempVal - 1] = tempVal;
         }
      } 
   }
   return true;
}

答案 2 :(得分:0)

有9个可能的值,因此您的数组的大小应为9,而不是3

您只需要计算单元格是否已经填充。如果有,则返回false。如果你在没有返回false的情况下结束它,则返回true。

++使返回的值递增,以便您可以对其进行比较。如果它是2,则单元格已经递增。

代码:

public class BlockTest {
  public static boolean checkBlock (int col0to2, int row0to2)
  {
    int [] tempArray = new int[9];
    for (int x=0; x<3; x++)
    {
      for (int y=0; y<3;y++)
      {
        int tempVal = board [col0to2+x][row0to2+y];
        if (tempVal < 1 || tempVal > 9) return false;
        if (++tempArray[tempVal - 1] == 2) return false;
      } 
    }
    return true;
  }

  public static int[][] board = new int[9][9];
  public static void main(String[] args) {
    for(int i = 0; i < 3; i++) {
      for(int j = 0; j < 3; j++) {
        board[i][j] = i*3 + j + 1;
      }
    }
    System.out.println(checkBlock(0,0));
    board[0][0] = 7;
    System.out.println(checkBlock(0,0));
  }
}

输出:

true
false

答案 3 :(得分:0)

我可以看到你来自哪里,但正如其他人所说,你的tempArray需要能够包含9个值。我之前写了一个数独检查器(单一分配,解决方案检查是正确的,整个数独应用程序的标记为90%)我的偏好是有一个包含9个值的数组,每个代表1-9位数字,但是我没有将值设置为tempVal,而是增加了它。检查你只会让每个号码中的一个更容易。

int [] boxCounts = {0, 0, 0, 0, 0, 0, 0, 0, 0};

// X loop
    // y loop
        // get value
        boxCounts[value - 1]++;
    // end y loop
// end x loop

// check we found one of each
for(int j = 0; j < 9; j++) {
    if(boxCounts[j] != 1 )
        return false;
    }
}