/ / З даного рядка (x), стовпця (y) знайдіть підмножину 3x3 2D 9x9 масиву - java, масиви, багатовимірний масив

З заданого рядка (x), стовпця (y) знайдіть 3x3 підрайон масиву 2D 9x9 - java, масиви, багатовимірний масив

Тому я намагаюся отримати всі можливі записиякі можна поставити в один квадрат судоку. У мене є 2x масив 9x9, який далі поділяється на 3x3 підряди. Я хочу написати метод, який приймає в своїх параметрах комбінацію рядків і стовпців і повертає всі можливі записи, які можна зробити в цій конкретній позиції. Перші 2 for-циклів мого методу приймають усі вже наявні ненульові значення у всьому вказаному рядку та всьому стовпці та зберігає їх у масиві (вжеInUse), на подальшому етапі буде використано, щоб зрозуміти, що номери вже не використовуються. Третій цикл for-loop повинен, використовуючи комбінацію рядків, стовпців, знайти певний підмасив і додати його записи до масиву вжеInUse.

Чи є спосіб знайти рядок, стовпець підматриці за допомогою заданого рядка, стовпця 2D масиву?

    // Method for calculating all possibilities at specific position
public int[] getPossibilities(int col, int row){
int [] possibilities;
int [] alreadyInUse = null;
int currentIndex = 0;
if(sudoku[row][col] != 0){
return  new int[]{sudoku[col][row]};
}
else{
alreadyInUse = new int[26];
//Go into Row x and store all available numbers in an alreadyInUse
for(int i=0; i<sudoku.length; i++){
if(sudoku[row][i] !=0){
alreadyInUse[currentIndex] = sudoku[row][i];
currentIndex++;
}
}
for(int j=0; j<sudoku.length; j++){
if(sudoku[j][col] !=0){
alreadyInUse[currentIndex] = sudoku[j][col];
currentIndex++;
}
}
for(int k=...???

}
return possibilities;
}

Відповіді:

2 для відповіді № 1

Ви можете використовувати модуль для фільтрації під масиву. Наприклад, одним із способів зробити це було б використання виразу n - (n % 3). Наприклад, якщо рядок - це стовпець 8 (останній стовпець у масиві, що індексується 0), це вираз повернеться 6. Це буде також повернути 6 для стовпця 6, але він поверне 3 для стовпця 5.

Потім, коли ви маєте верхню ліву клітинку, ви можете провести цикл через усі 9 комірок, використовуючи вкладений цикл, три за один раз.

Ось відповідний код:

int x_left = (row - (row % 3));
int y_top = (col - (col % 3));
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(sudoku[i + x_left][j + y_top] != 0) {
alreadyInUse[currentIndex] = sudoku[i + x_left][j + y_top];
currentIndex++;
}
}
}