проверка строк и столбцов в сетке 9×9

#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