#java #methods #sudoku
#java #методы #судоку
Вопрос:
Я пытаюсь понять, как ответить на этот вопрос в моем коде:
создайте метод с именем getValidValues, который: возвращает массив из 9 логических значений, соответствующих 9 цифрам (1-9), и это верно, если эта цифра может быть помещена в эту позицию [строка] [столбец] без нарушения правил игры.
Это мой код:
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 resu<
}
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) amp;amp; (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) amp;amp; (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) amp;amp; (j != testCol) amp;amp; (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]) amp;amp; !isInCol(col,digit[i]) amp;amp; !isInBox(row,col,digit[i])) {
validValues[i][j] = true;
} else {
validValues[i][j] = false;
}
}
}
return validValues;
}
Я отредактировал код, добавив другие, частные, методы, называемые: isInRow, isInCol, isInBox. Я подумал сделать это, чтобы получить более простой способ реализации метода getValidValues. О чем вы думаете? Есть ли какие-либо предложения?
Комментарии:
1. Не могли бы вы, пожалуйста, использовать имена на английском в своем коде?
2. извините, я сейчас исправлю
Ответ №1:
Главное правило в судоку таково: все числа в столбце, строке и квадрате 3×3 должны быть уникальными. Исходя из этого, вам нужно сделать три вещи:
- Выполните итерацию по всем ячейкам в одном столбце. Если данный столбец содержит число, установите для этого числа значение invalid.
- То же, что и выше, но для строки.
- Найдите квадрат 3×3 для ячейки, которую вы проверяете. Это начнется с координат типа
[floor(x/3), floor(y/3)]
. Затем вы перебираете ячейки в этом квадрате и присваиваете числам значение invalid, как указано выше.
Я надеюсь, этого достаточно, чтобы вы начали. Не хочу публиковать код, потому что это отнимет процесс обучения.
Комментарии:
1. я пытаюсь, как вы сказали. Я опубликую фрагмент кода, когда закончу!
2. ‘общедоступное логическое значение[][] getValidValues(int row, int column) { логическое значение[][] Допустимые значения = новое логическое значение[9][9]; int[] цифра = {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(строка, цифра[i]) amp;amp; !isInCol(строка, цифра[i]) amp;amp; !isInBox(строка, столбец.цифра[i])) { Допустимые значения[i][j] = true; } } } возвращает valoriValidi; }’
3. @AndreaManisi Не публикуйте код в комментариях, он полностью нечитаем.
4. @AndreaManisi вы могли бы отредактировать свой вопрос и поместить свой новый код ниже.