isValidConfiguration static method
Returns true
if the configuration of the sudoku
follows the rules
of Sudoku.
Conditions:
- List of 9 Lists of 9 ints
- Every row must have the numbers 1-9 without repetition
- Every column must have the numbers 1-9 without repetition
- Every 3x3 box must have the number 1-9 without repetition
- Only positions of non-zero and non-null values are considered
- Number of possible solutions of the puzzle is not considered
Implementation
static bool isValidConfiguration(List<List<int?>> sudoku) {
bool notInRow(List<List<int?>> sudoku, int rowNumber) {
var numberSet = <int>{};
for (var i = 0; i < 9; i++) {
if (numberSet.contains(sudoku[rowNumber][i])) {
return false;
} else if (sudoku[rowNumber][i] != 0 && sudoku[rowNumber][i] != null) {
numberSet.add(sudoku[rowNumber][i]!);
}
}
return true;
}
bool notInColumn(List<List<int?>> sudoku, int columnNumber) {
var numberSet = <int>{};
for (var i = 0; i < 9; i++) {
if (numberSet.contains(sudoku[i][columnNumber])) {
return false;
} else if (sudoku[i][columnNumber] != 0 &&
sudoku[i][columnNumber] != null) {
numberSet.add(sudoku[i][columnNumber]!);
}
}
return true;
}
bool notInBox(List<List<int?>> sudoku, int startRow, int startColumn) {
var numberSet = <int>{};
for (var row = 0; row < 3; row++) {
for (var column = 0; column < 3; column++) {
if (numberSet
.contains(sudoku[row + startRow][column + startColumn])) {
return false;
} else if (sudoku[row + startRow][column + startColumn] != 0 &&
sudoku[row + startRow][column + startColumn] != null) {
numberSet.add(sudoku[row + startRow][column + startColumn]!);
}
}
}
return true;
}
bool isValid(List<List<int?>> sudoku, int rowNumber, int columnNumber) =>
notInRow(sudoku, rowNumber) &&
notInColumn(sudoku, columnNumber) &&
notInBox(
sudoku, rowNumber - rowNumber % 3, columnNumber - columnNumber % 3);
bool containsValidValues(List<List<int?>> sudoku) {
var validValueSet = <int?>{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, null};
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
if (!validValueSet.contains(sudoku[i][j])) {
return false;
}
}
}
return true;
}
try {
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
if (!isValid(sudoku, i, j)) {
return false;
}
}
}
} on RangeError {
return false;
}
if (!containsValidValues(sudoku)) {
return false;
}
return true;
}