#java #sudoku
#Ява #судоку
Вопрос:
У меня есть задание, в котором я должен создать следующие классы:
public class Square3x3 { private int[][] mat = new int [3][3]; public boolean allThere(){ int[] options = {1,2,3,4,5,6,7,8,9}; for (int i = 0 ; i lt; NUM_OF_ROWS; i ){ for(int j =0 ; j lt; NUM_OF_COLS; j ){ for (int k = 0; k lt; options.length; k ){ if(mat[i][j] == options[k]) { options[k] = -1; break; } } } } for (int num : options) { if(num != -1) return false; } return true; }
класс, представляющий 2d-массив 3×3, и класс судоку, построенный с помощью 2d-массива 3×3 из объектов Square3x3:
public class Sudoku { private Square3x3[][] grid9x9 = new Square3x3[3][3]; }
Мне нужно проверить, действительна ли сетка 9×9, у меня есть способ проверить, действителен ли один объект 3×3, но мне также нужно проверить, действительна ли вся строка/столбец сетки 9×9 (содержит все числа от 1 до 9)
Комментарии:
1. Разве вы не можете просто перебрать одну строку/столбец и проверить значения?
2. но как я могу повторить все 9 чел за один раз? один ряд состоит из трех квадратов 3х3
3. Квадрат 3×3 также является двумерным массивом, вы можете повторять по одной строке за раз. например, для повторения в первой строке вы можете использовать: for(int j = 0; j
4. Определения данных вашего задания усложняют задачу проверки 9 x 9. Было бы намного проще создать один массив 9 x 9 int и передать в класс подмассив 3 x 3 int
Square3x3
. Вы бы сделали это, передав строку и столбец в левом верхнем углу 3 x 3 внутри 9 x 9. В качестве одного примера, средний массив 3 x 3 int расположен, начиная со строки 3, столбец 3.
Ответ №1:
Вот один из способов улучшить ваши определения данных, используя одни и те же два класса. Определите один массив 9 x 9 int и передайте подмассив своему allThere
методу, используя индексы строк и столбцов.
public class Sudoku { private int[][] grid9x9 = new int[9][9]; } public class Square3x3 { public boolean allThere(int[][] grid, int row, int column) { int[] options = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for (int i = row; i lt; row 3; i ) { for (int j = column; j lt; column 3; j ) { options = testOptions(options, grid[i][j]); } } for (int num : options) { if (num != -1) return false; } return true; } private int[] testOptions(int[] options, int gridValue) { for (int i = 0; i lt; options.length; i ) { if (gridValue == options[i]) { options[i] = -1; break; } } return options; } }
Я очистил ваш allThere
код, чтобы задокументировать, что break
оператор выходит только из цикла параметров.
Комментарии:
1. спасибо, но доска для судоку должна представлять собой список 3х3 квадратных объектов размером 3х3