-
Notifications
You must be signed in to change notification settings - Fork 84
Open
Description
习题
出处:LeetCode 算法第37题
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
- 数字
1-9在每一行只能出现一次。- 数字
1-9在每一列只能出现一次。- 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。空白格用
'.'表示。一个数独。
答案被标成红色。
Note:
- 给定的数独序列只包含数字
1-9和字符'.'。- 你可以假设给定的数独只有唯一解。
- 给定数独永远是
9x9形式的。
思路
采用回溯法,遍历所有可能性,找出满足条件的解
解答
/**
* @param {character[][]} board
* @return {void} Do not return anything, modify board in-place instead.
*/
// 判断一行内是否可以放置
var isRowSafe = function (board, row, value) {
for (var i = 0; i < 9; i++) {
if (board[row][i] == value) {
return false;
}
}
return true;
}
// 判断一列内是否可以放置
var isColumnSafe = function (board, column, value) {
for (var i = 0; i < 9; i++) {
if (board[i][column] == value) {
return false;
}
}
return true;
}
// 判断九宫格内是否可以放置
var isBoardSafe = function (board, row, column, value) {
var rowOffset = Math.floor(row / 3) * 3;
var columnOffset = Math.floor(column / 3) * 3;
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
if (board[rowOffset + i][columnOffset + j] == value) {
return false;
}
}
}
return true;
}
var isSafe = function (board, row, column, value) {
return isRowSafe(board, row, value) && isColumnSafe(board, column, value) && isBoardSafe(board, row, column, value);
}
function solve(board, row, column) {
if (column == 9 && row == 8) {
return true;
}
if (column == 9) {
column = 0;
row++;
}
if (board[row][column] != '.') {
return solve(board, row, column + 1);
}
for (var i = 1; i <= 9; i++) {
if (isSafe(board, row, column, i)) {
board[row][column] = i.toString();
if (solve(board, row, column + 1)) {
return true;
}
}
}
board[row][column] = '.';
return false;
}
var solveSudoku = function (board) {
solve(board, 0, 0);
};Metadata
Metadata
Assignees
Labels
No labels