解题思路
代码
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution: def solveSudoku(self, board: List[List[str]]) -> None: def dfs(pos: int): nonlocal valid if pos == len(spaces): valid = True return i, j = spaces[pos] for digit in range(9): if line[i][digit] == column[j][digit] == block[i // 3][j // 3][digit] == False: line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = True board[i][j] = str(digit + 1) dfs(pos + 1) line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = False if valid: return line = [[False] * 9 for _ in range(9)] column = [[False] * 9 for _ in range(9)] block = [[[False] * 9 for _a in range(3)] for _b in range(3)] valid = False spaces = list()
for i in range(9): for j in range(9): if board[i][j] == ".": spaces.append((i, j)) else: digit = int(board[i][j]) - 1 line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = True
dfs(0)
|
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Solution { private: bool line[9][9]; bool column[9][9]; bool block[3][3][9]; bool valid; vector<pair<int, int>> spaces;
public: void dfs(vector<vector<char>>& board, int pos) { if (pos == spaces.size()) { valid = true; return; }
auto [i, j] = spaces[pos]; for (int digit = 0; digit < 9 && !valid; ++digit) { if (!line[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]) { line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true; board[i][j] = digit + '0' + 1; dfs(board, pos + 1); line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = false; } } }
void solveSudoku(vector<vector<char>>& board) { memset(line, false, sizeof(line)); memset(column, false, sizeof(column)); memset(block, false, sizeof(block)); valid = false;
for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { if (board[i][j] == '.') { spaces.emplace_back(i, j); } else { int digit = board[i][j] - '0' - 1; line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true; } } }
dfs(board, 0); } };
|
Go
func solveSudoku(board [][]byte) {
var line, column [9][9]bool
var block [3][3][9]bool
var spaces [][2]int
for i, row := range board {
for j, b := range row {
if b == '.' {
spaces = append(spaces, [2]int{i, j})
} else {
digit := b - '1'
line[i][digit] = true
column[j][digit] = true
block[i/3][j/3][digit] = true
}
}
}
var dfs func(int) bool
dfs = func(pos int) bool {
if pos == len(spaces) {
return true
}
i, j := spaces[pos][0], spaces[pos][1]
for digit := byte(0); digit < 9; digit++ {
if !line[i][digit] && !column[j][digit] && !block[i/3][j/3][digit] {
line[i][digit] = true
column[j][digit] = true
block[i/3][j/3][digit] = true
board[i][j] = digit + '1'
if dfs(pos + 1) {
return true
}
line[i][digit] = false
column[j][digit] = false
block[i/3][j/3][digit] = false
}
}
return false
}
dfs(0)
}