Вы можете изменить свой checkSubsMethod.
- Добавьте i и j верхнего левого угла субблока судоку (например, (0,0), (0,3), ... (3,0), (3,3) ... (6,3) ), (6,6)).
- Используйте set, чтобы проверить, используется ли уже используемое значение или нет. Метод add () класса Set возвращает
true
, если значение отсутствует в наборе, и false
, если значение уже добавлено в набор.
И когда вы обобщаете свой метод, вы можете использовать его для полей любого размера. В вашем случае размер 9x9, вот пример
public static boolean checkSubs(int[][] p, int topI, int topJ) {
Set<Integer> nums = new HashSet<>();
for (int i = topI; i < topI + 3; i++) {
for (int j = topJ; j < topJ + 3; j++) {
if (!nums.add(p[i][j])) {
return false;
}
}
}
return true;
}
public static void main(String[] args) {
int[][] sudoku = {
{1,2,3,1,2,3,1,2,3},
{4,5,6,4,5,6,4,5,6},
{7,8,9,7,8,9,7,8,9},
{1,2,3,1,2,3,1,2,3},
{4,5,6,4,5,6,4,5,6},
{7,8,9,7,8,9,7,8,9},
{1,2,3,1,2,3,1,2,3},
{4,5,6,4,5,6,4,5,6},
{7,8,9,7,8,9,7,8,9}};
for (int i = 0; i < sudoku.length;i += 3){
for (int j = 0; j<sudoku[0].length; j += 3){
if (!checkSubs(sudoku, i, j)){
System.out.println("DUPLICATED VALUES FOUND!");
return;
}
}
}
System.out.println("OK!!");
}
Выход для этого случая будет OK!!
Если вы измените ввод, как это
int[][] sudoku = {
{3,3,3,1,2,3,1,2,3},
{4,5,6,4,5,6,4,5,6},
{7,8,9,7,8,9,7,8,9},
{1,2,3,1,2,3,1,2,3},
{4,5,6,4,5,6,4,5,6},
{7,8,9,7,8,9,7,8,9},
{1,2,3,1,2,3,1,2,3},
{4,5,6,4,5,6,4,5,6},
{7,8,9,7,8,9,7,8,9}};
Выход будет DUPLICATED VALUES FOUND!
В будущем вы можете изменить этот пример для своих целей.