Тому я намагаюся отримати всі можливі записиякі можна поставити в один квадрат судоку. У мене є 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++;
}
}
}