数独:某个位置的有效值

问题描述 投票:-2回答:1

我想在我的代码中找出如何回答这些问题:

创建一个名为getValidValues的方法:返回一个9个布尔值的数组,对应9个数字(1-9),如果该数字可以放在那个位置[row] [column]而不违反游戏规则,则为true。

这是我的代码:

public class SudokuClass {

private final int SIZE = 9;
boolean board = new int[SIZE][SIZE];
boolean[][] start = new boolean[SIZE][SIZE];

public SudokuClass() {
    for(int i=0; i < SIZE; i++) {
        for(int j=0; j < SIZE; j++) {
            board[i][j] = 0;
        }
    }
}

public String toString () {
      String result = "";
      for (int i = 0; i < SIZE; i++) {
        if (i % 3 == 0) {
          result = result + "+-------+-------+-------+\n";
        }
        for (int j = 0; j < SIZE; j++) {
          if (j % 3 == 0) {
            result = result + "| ";
          }
          if (scacchiera [i] [j] == 0) {
            result = result + "  ";
          } else {
            result = result + board[i][j] + " ";
          }
        }
        result = result + "|\n";
      }
      result = result + "+-------+-------+-------+\n";
      return result;
  }

public void addStartValues(int row,int col, int val) {
    board[row][col] = value;
    start[row][col] = true;
}

public void addMove(int row,int col,int val) {
    scacchiera[row][col] = val;
    inizio[row][col] = false;
}

public boolean verifyGame () {
    if (board.length != 9) {
      System.out.println("Board should have 9 rows");
      return false;
    }
    for (int i = 0; i < board.length; i++) {
      if (board[i].length != 9) {
        System.out.println("Row "+ i +" should have 9 cells.");
        return false;
      }
    }
    /* check each cell for conflicts */
    for (int i = 0; i < board.length; i++) {
      for (int j = 0; j < board.length; j++) {
        int cell = board[i][j];
        if (cell == 0) {
          continue;   /* blanks are always OK */
        }
        if ((cell < 1) || (cell > 9)) {
          System.out.println("Row "+ i +", column "+ j +" has value illegal "+ cell);
          return false;
        }
        /* does it match any other value in the same row? */
        for (int m = 0; m < board.length; m++) {
          if ((j != m) && (cell == board[i][m])) 
          {
            System.out.println("Row "+ i +" has "+ cell +" in position "+ j +" and "+ m);
            return false;
          }
        }
        /* does it match any other value it in the same column? */
        for (int k = 0; k < board.length; k++) {
          if ((i != k) && (cell == board[k][j])) {
            System.out.println("Column "+ j +" has "+ cell +" in position "+ i +" and "+ k);
            return false;
          }
        }
        /* does it match any other value in the 3x3? */
        for (int k = 0; k < 3; k++) {
          for (int m = 0; m < 3; m++) {
            int testRow = (i / 3 * 3) + k;   /* test this row */
            int testCol = (j / 3 * 3) + m;   /* test this col */
            if ((i != testRow) && (j != testCol) && (cell == board[testRow][testCol])) {
                    System.out.println("Value "+ cella +" at row "+ i +", column "+ j +" matches with value at row "+ testRow +", column "+ testColumn);
                    return false;
            }
          }
        }
      }
    }
    return true;
}

public int getValoreIn(int row, int col) {
    return scacchiera[row][col];
}

private boolean isInRow(int row, int num) {
    for (int i = 0; i < SIZE; i++)
        if (board[row][i] == num) {
            return true;
        }
    return false;
}

// we check if a possible number is already in a column
private boolean isInCol(int col, int number) {
    for (int i = 0; i < SIZE; i++)
        if (board[i][col] == number) {
            return true;
        }
    return false;
}

// we check if a possible number is in its 3x3 box
private boolean isInBox(int row, int col, int number) {
    int r = row - row % 3;
    int c = col - col % 3;

    for (int i = r; i < r + 3; i++)
        for (int j = c; j < c + 3; j++)
            if (board[i][j] == number) {
                return true;
            }
    return false;
}

public boolean[][] getValidValues(int row, int col) {
    boolean[][] validValues = new boolean[9][9];
    int[] digit = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    for(int i=0; i < digit.length; i++) {
        for(int j=0; j < digit.length; j++) {
            if(!isInRow(row,digit[i]) && !isInCol(col,digit[i]) && !isInBox(row,col,digit[i])) {
                validValues[i][j] = true;
            } else {
                validValues[i][j] = false;
            }
        }
    }
    return validValues;
}

我编辑了代码,添加了其他私有方法:isInRow,isInCol,isInBox。我想这样做是为了更简单的方法来实现方法getValidValues。你有什么想法?有什么建议吗?

java methods sudoku
1个回答
0
投票

数独的主要规则是:列中的所有数字,行和3x3正方形必须是唯一的。基于此,你必须做三件事:

  • 迭代同一列中的所有单元格。如果给定列包含数字,请将该数字设置为无效。
  • 与上面相同但是对于行。
  • 找出您正在验证的单元格的3x3平方。它将从像[floor(x/3), floor(y/3)]这样的坐标开始。然后,您迭代该方块中的单元格并将数字设置为无效,就像上面一样。

我希望这足以让你开始。不想发布代码,因为这会带走学习过程。

© www.soinside.com 2019 - 2024. All rights reserved.