Java 数独:位置中的有效值
我试图在我的代码中找到这些问题的答案: 创建一个名为getValidValues的方法,该方法返回一个由9个布尔值组成的数组,对应于9个数字1-9,如果该数字可以在不违反游戏规则的情况下放置在该位置[行][列],则为真 这是我的代码:Java 数独:位置中的有效值,java,methods,sudoku,Java,Methods,Sudoku,我试图在我的代码中找到这些问题的答案: 创建一个名为getValidValues的方法,该方法返回一个由9个布尔值组成的数组,对应于9个数字1-9,如果该数字可以在不违反游戏规则的情况下放置在该位置[行][列],则为真 这是我的代码: public class SudokuClass { private final int SIZE = 9; boolean board = new int[SIZE][SIZE]; boolean[][] start = new boolean[SIZE][S
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方法。你觉得怎么样?有什么建议吗?数独游戏的主要规则是:一列、一行和一个3x3正方形中的所有数字都必须是唯一的。基于此,你必须做三件事: 迭代同一列中的所有单元格。如果给定列包含数字,请将该数字设置为无效。 同上,但适用于该行。 找出要验证的单元格的3x3正方形。它将从[floorx/3,floory/3]这样的坐标开始。然后迭代该正方形中的单元格,并将数字设置为无效,如上所述。
我希望这足以让你开始。我不想发布代码,因为这会影响学习过程。请在代码中使用英文名称,好吗?对不起,我现在就纠正。我正按照你说的那样尝试。我会在完成后发布这段代码公共布尔值[]getValidValuesint行,int列{boolean[]validValues=新布尔值[9][9];int[]数字={1,2,3,4,5,6,7,8,9};forint i=0;i