isValidConfiguration static method

bool isValidConfiguration(
  1. List<List<int?>> sudoku
)

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;
}