diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md index a580f270..3d69b958 100644 --- a/problems/0037.解数独.md +++ b/problems/0037.解数独.md @@ -61,7 +61,7 @@ 代码如下: -``` +```cpp bool backtracking(vector>& board) ``` @@ -504,5 +504,54 @@ void solveSudoku(char** board, int boardSize, int* boardColSize) { } ``` +### Swift + +```swift +func solveSudoku(_ board: inout [[Character]]) { + // 判断对应格子的值是否合法 + func isValid(row: Int, col: Int, val: Character) -> Bool { + // 行中是否重复 + for i in 0 ..< 9 { + if board[row][i] == val { return false } + } + + // 列中是否重复 + for j in 0 ..< 9 { + if board[j][col] == val { return false } + } + + // 9方格内是否重复 + let startRow = row / 3 * 3 + let startCol = col / 3 * 3 + for i in startRow ..< startRow + 3 { + for j in startCol ..< startCol + 3 { + if board[i][j] == val { return false } + } + } + return true + } + + @discardableResult + func backtracking() -> Bool { + for i in 0 ..< board.count { // i:行坐标 + for j in 0 ..< board[0].count { // j:列坐标 + guard board[i][j] == "." else { continue } // 跳过已填写格子 + // 填写格子 + for val in 1 ... 9 { + let charVal = Character("\(val)") + guard isValid(row: i, col: j, val: charVal) else { continue } // 跳过不合法的 + board[i][j] = charVal // 填写 + if backtracking() { return true } + board[i][j] = "." // 回溯:擦除 + } + return false // 遍历完数字都不行 + } + } + return true // 没有不合法的,填写正确 + } + backtracking() +} +``` + -----------------------