Ошибка пытается решить судоку с помощью машинописи и возврата - PullRequest
0 голосов
/ 12 апреля 2020

Я работаю над алгоритмами и для проверки возврата назад я решил внедрить решатель судоку в машинописи.

Я использую простую реализацию возврата, ничего особенного, но она не работает:


export type SudokuBoard  = Array<Array<number>>;
export type Location = [number, number];

const UNASSIGNED = 0;

// Functions
export const range = (start: number, end: number): Array<number> =>
  Array.from({ length: end - start + 1 }, (_, i) => start + i);

function findEmptyLocation(board: SudokuBoard): Location {
  for (const row of range(0, 8))
    for (const col of range(0, 8))
      if (board[row][col] === UNASSIGNED) {
        return [row, col];
      }
  return null;
}

function usedInRow(board: SudokuBoard, row: number, value: number): boolean {
  for (const i of range(0, 8))
    if (board[row][i] === value)
      return true;

  return false;
}

function usedInCol(board: SudokuBoard, col: number, value: number): boolean {
  for (const i of range(0, 8))
    if(board[i][col] === value)
      return true;

  return false;
}

function usedInBox(board: SudokuBoard, row: number, col: number, value: number): boolean {
  for (const i of range(0, 2))
    for (const j of range(0, 2))
      if (board[i + row][j + col] === value)
        return true;

  return false;
}

const checkIsSafeLocation = (board: SudokuBoard, row: number, col: number, value: number) =>
  !usedInRow(board, row, value) && !usedInCol(board, col, value) && !usedInBox(board, row, col, value);


export function solveSudoku(board: SudokuBoard): boolean {
  const emptyLocation = findEmptyLocation(board);

  if (!emptyLocation)
    return true; // sudoku is solved!!

  const [row, column] = emptyLocation;

  for (const value of range(1, 9)) {
    // if looks promising (empty position)
    if (checkIsSafeLocation(board, row, column, value)) {
      console.log(`Position: (${row}, ${column}) accepts value: ${value}`);
      board[row][column] = value;

      if (solveSudoku(board)) // if is solved returns!!!
        return true;

      // not solved, reset location and try again
      board[row][column] = UNASSIGNED;
    }
  }

  return false;
}


// EXECUTION

console.clear();
console.log(solveSudoku([
    [0, 1, 6, 5, 7, 8, 4, 9, 2],
    [5, 2, 9, 1, 3, 4, 7, 6, 8],
    [4, 8, 7, 6, 2, 9, 5, 3, 1],
    [2, 6, 3, 4, 1, 5, 9, 8, 7],
    [9, 7, 4, 8, 6, 3, 1, 0, 5],
    [8, 5, 1, 7, 9, 2, 6, 4, 3],
    [1, 3, 8, 9, 4, 7, 2, 5, 6],
    [6, 9, 0, 3, 5, 1, 8, 7, 4],
    [7, 4, 5, 2, 8, 6, 3, 1, 0],
  ]));

Вы можете проверить это здесь: stackblitz

Что-то в моем коде не так, потому что это не работает, но я не вижу проблемы.

Вы можете мне помочь?

1 Ответ

0 голосов
/ 12 апреля 2020

Я нашел проблему.

Ящики неправильно рассчитаны.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...