# 37. Sudoku Solver
題目:<https://leetcode.com/problems/sudoku-solver/>
解法:使用set紀錄出現的數字,一格一格嘗試每個數字是否符合規則,如果符合就去找下一格,若不符合就往回前一個繼續嘗試其他數字,直到所有格子都填完。
Python3:
``` python 3
class Solution:
def solveSudoku(self, board: list[list[str]]) -> None:
def backtrack(step):
nonlocal isSolved
if step == 81:
isSolved = True
return
x = step // 9
y = step % 9
box = x // 3 * 3 + y // 3
if board[x][y] != ".":
backtrack(step + 1)
else:
for num in range(1, 10):
if isSolved == False \
and num not in rowCheck[x] \
and num not in colCheck[y] \
and num not in boxCheck[box]:
rowCheck[x].add(num)
colCheck[y].add(num)
boxCheck[box].add(num)
board[x][y] = str(num)
backtrack(step + 1)
if isSolved == False:
rowCheck[x].remove(num)
colCheck[y].remove(num)
boxCheck[box].remove(num)
board[x][y] = '.'
rowCheck = [set() for _ in range(9)]
colCheck = [set() for _ in range(9)]
boxCheck = [set() for _ in range(9)]
for x in range(9):
for y in range(9):
if board[x][y] != ".":
val = int(board[x][y])
rowCheck[x].add(val)
colCheck[y].add(val)
box = x // 3 * 3 + y // 3
boxCheck[box].add(val)
isSolved = False
backtrack(0)
if __name__ == '__main__':
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"]]
Solution().solveSudoku(board)
print(board)
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void solveSudoku(char** board, int boardSize, int* boardColSize) {
bool isSolved = false;
int rowCheck[9][10] = {}, colCheck[9][10] = {}, boxCheck[9][10] = {};
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
if (board[x][y] != '.') {
int val = board[x][y] - '0';
rowCheck[x][val] = 1;
colCheck[y][val] = 1;
int box = x / 3 * 3 + y / 3;
boxCheck[box][val] = 1;
}
}
}
void backtrack(int step) {
if (step == 81) {
isSolved = true;
return;
}
int x = step / 9, y = step % 9, box = x / 3 * 3 + y / 3;
if (board[x][y] != '.')
backtrack(step + 1);
else {
for (int num = 1; num < 10; num++) {
if (isSolved == false && rowCheck[x][num] == 0
&& colCheck[y][num] == 0 && boxCheck[box][num] == 0) {
rowCheck[x][num] = 1;
colCheck[y][num] = 1;
boxCheck[box][num] = 1;
board[x][y] = num + '0';
backtrack(step + 1);
if (isSolved == false) {
rowCheck[x][num] = 0;
colCheck[y][num] = 0;
boxCheck[box][num] = 0;
board[x][y] = '.';
}
}
}
}
}
backtrack(0);
return;
}
int main()
{
char data[9][9] = {{'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'}};
int boardSize = 9;
int * boardColSize = (int*)malloc(sizeof(int) * boardSize);
char ** board = (char**)malloc(sizeof(char*) * boardSize);
for (int i = 0; i < boardSize; i++) {
boardColSize[i] = 9;
board[i] = (char*)malloc(sizeof(char) * boardColSize[i]);
for (int j = 0; j < boardColSize[i]; j++)
board[i][j] = data[i][j];
}
solveSudoku(board, boardSize, boardColSize);
for (int i = 0; i < boardSize; i++) {
for (int j = 0; j < boardColSize[i]; j++)
printf("%c", board[i][j]);
printf("\n");
}
return 0;
}
```
###### tags: `leetcode` `backtracking`