Сложность: medium
Дана доска Sudoku 9x9. Нужно проверить, является ли она действительной. Проверке подлежат только заполненные ячейки, по правилам:
- В каждой строке цифры от 1 до 9 не должны повторяться
- В каждом столбце цифры от 1 до 9 не должны повторяться
- В каждом из девяти блоков 3x3 цифры от 1 до 9 не должны повторяться
Пример:
Input: board =
[["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]]
Output: true
👨💻 Алгоритм:
1️⃣ Создаем три структуры:
rowSet, colSet, boxSet (или Map), чтобы отслеживать наличие чисел в строках, столбцах и блоках 3x3. 2️⃣ Проходим по каждой ячейке поля:
- Пропускаем, если это
. - Проверяем наличие текущей цифры в соответствующей строке, столбце и блоке
- Если она уже была — возвращаем
false - Иначе добавляем в соответствующие множества
3️⃣ Если дошли до конца, не нарушив правил — возвращаем
true 😎 Решение:
var isValidSudoku = function(board) {
const rows = new Array(9).fill(0).map(() => new Set());
const cols = new Array(9).fill(0).map(() => new Set());
const boxes = new Array(9).fill(0).map(() => new Set());
for (let r = 0; r < 9; r++) {
for (let c = 0; c < 9; c++) {
const val = board[r][c];
if (val === '.') continue;
const boxIdx = Math.floor(r / 3) * 3 + Math.floor(c / 3);
if (rows[r].has(val) || cols[c].has(val) || boxes[boxIdx].has(val)) {
return false;
}
rows[r].add(val);
cols[c].add(val);
boxes[boxIdx].add(val);
}
}
return true;
};Ставь 👍 и забирай 📚 Базу знаний
