text: module.exports = function solveSudoku(matrix) {
    //Depth-first search algorithm
  
    const sizeMatrix = 9; // Размер матрицы
    const sizeBox = 3; //Размер ячейки
  
    // Функция, которая проходит по всем элеметам двухмерного массива и индексы незаполненных ячеек.
    // После этого выводит координаты этих ячеек в массив
    function findEmptyPosition(matrix) {
      for (let r = 0; r < sizeMatrix; r++) {
        for (let c = 0; c < sizeMatrix; c++) {
          if (matrix[r][c] === 0) {
            return [r, c];
          }
        }
      }
      return null;
    }
  
    //Функция для проверки условий (нет совпадений в строке/столбце/ячейке)
    function isValidate(num, pos, matrix) {
      const [r, c] = pos; // Деструктурирующее присваивание (Деструктуризация)
      //console.log(pos[0]); // Пример вывода
      //console.log(pos[1]);
  
      //Проверка условий в строке (проходит по всем строкам в колонке, кроме строки в которую нужно сделать вставку значения)
      for (let i = 0; i < sizeMatrix; i++) {
        if (matrix[i][c] === num && i !== r) {
          return false;
        }
      }
  
      //Проверка условий в колонке (проходит по всем столбцам в строке, кроме столбца в который нужно сделать вставку значения)
      for (let i = 0; i < sizeMatrix; i++) {
        if (matrix[r][i] === num && i !== c) {
          return false;
        }
      }
  
      //Проверка условий в ячейке (3х3) (проходит по позициям в ячейке, кроме ячейки в которую нужно сделать вставку значения)
      const startInBoxRow = Math.floor(r / sizeBox) * sizeBox; //Поиск начальной позции ячейки по горизонтали
      const startInBoxCol = Math.floor(c / sizeBox) * sizeBox; //Поиск начальной позции ячейки по вертикали
      for (let i = startInBoxRow; i < startInBoxRow + sizeBox; i++) {
        for (let j = startInBoxCol; j < startInBoxCol + sizeBox; j++) {
          if (matrix[i][j] === num && i !== r && j !== c) {
            return false;
          }
        }
      }
      return true;
    }
  
    function solve() {
      const currentPosition = findEmptyPosition(matrix);
  
      // Проверка на наличие пустой ячейки. Если пустых ячеек не осталось, то мы выходим из функции и возвращаем заполенную матрицу(строка 81/82).
      if (currentPosition === null) {
        return true;
      }
  
      for (let i = 1; i < sizeMatrix + 1; i++) {
        const currentNumber = i;
        const isValid = isValidate(currentNumber, currentPosition, matrix);
        //Проверка на выполнение условий.
        if (isValid) {
          const [x, y] = currentPosition;
          matrix[x][y] = currentNumber;
  
          //Если проверка проходит, то заполняется ячейка значением
          if (solve()) {
            return true;
          }
          //Если проверка не проходит, то ячейке присваивается значение 0 и проверка идет по новому кругу
          matrix[x][y] = 0;
        }
      }
  
      return false;
    }
  
    solve();
    return matrix;
  };
  