3

私はこの数独ソルバーをJavaで実行していますが、何らかの理由でコードにエラーがあり、修正できません。私のコードには、guess各ボックスの 1 ~ 9 の数字を推測する関数があり、その数字が以前に書き込まれているかどうかをチェックします。

エラーは次の行にあります。

 else if (board[r + (i % 3)][c + (i / 3)] == num)

何らかの理由で (divide by 0) を取得する場所ArithmeticExceptionがわかりません。あなたが助けてくれることを願っています

私のコード:

public class SudokuSolver
{
final int size = 9;
private int box_size;

private int[][] board;

// Create an empty board
public SudokuSolver()
{
  board = new int[size][size];
  this.box_size = size / 3;

}

// initialize a given board
public SudokuSolver(int[][] board)
{
  this.board = board;
}

public void setCell(int num, int row, int col)
{
  board[row][col] = num;
}

public int getCell(int row, int col)
{
  return board[row][col];
}

private boolean check(int num, int row, int col)
{
  int r = (row / 3) * 3;
  int c = (col / 3) * 3;

  for (int i = 0; i < size; i++)
  {
     if (board[row][i] == num)
        return false;

     else if (board[i][col] == num)
        return false;

     else if (board[r + (i % box_size)][c + (i / box_size)] == num)
        return false;
  }
  return true;
  }

  public boolean guess(int row, int col)
  {
  int nextCol = (col + 1) % size;
  int nextRow = (nextCol == 0) ? row + 1 : row;

  try
  {
     if (board[row][col] != 0)
        return guess(nextRow, nextCol);
  }
  catch (ArrayIndexOutOfBoundsException e)
  {
     return true;
  }

  for (int i = 1; i <= size; i++)
  {
     if (check(i, row, col))
     {
        board[row][col] = i;
        if (guess(nextRow, nextCol))
        {
           return true;
        }
     }
  }
  board[row][col] = 0;
  return false;
  }

  public void printBoard()
  {
  for (int row = 0; row < size; row++)
  {
     for (int col = 0; col < size; col++)
     {
        System.out.print(board[row][col] + "  ");
     }
     System.out.println();
   }

  }



  public static void main(String[] args)
  {

  int[][] board = { { 0, 6, 0, 1, 0, 4, 0, 5, 0 },
        { 0, 0, 8, 3, 0, 5, 6, 0, 0 }, { 2, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 8, 0, 0, 4, 0, 7, 0, 0, 6 }, { 0, 0, 6, 0, 0, 0, 3, 0, 0 },
        { 7, 0, 0, 9, 0, 1, 0, 0, 4 }, { 5, 0, 0, 0, 0, 0, 0, 0, 2 },
        { 0, 0, 7, 2, 0, 6, 9, 0, 0 }, { 0, 4, 0, 5, 0, 8, 0, 7, 0 } };

  SudokuSolver ss = new SudokuSolver(board);
  ss.printBoard();
  System.out.println();
  System.out.println();
  if(ss.guess(0, 0))
     ss.printBoard();


 }
4

1 に答える 1

3

box_sizeエラーが発生した時点より前に印刷すると、それが実際にエラーであることがわかり0ます。このコンストラクターで初期化することはないため、デフォルト値の を保持します0

public SudokuSolver(int[][] board) {
    this.board = board;
}

のような行を含めるつもりだったのでしょうthis.box_size = board.length / 3


PSエラーの原因となる実際の行は

else if (board[r + (i % box_size)][c + (i / box_size)] == num)

おそらくbox_size、質問で期待していたものを代用するべきではありませんでした。

于 2012-11-21T18:06:23.003 に答える