mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
添加 0037.解数独.md Scala版本
This commit is contained in:
@ -602,5 +602,100 @@ func solveSudoku(_ board: inout [[Character]]) {
|
||||
}
|
||||
```
|
||||
|
||||
### Scala
|
||||
|
||||
详细写法:
|
||||
```scala
|
||||
object Solution {
|
||||
|
||||
def solveSudoku(board: Array[Array[Char]]): Unit = {
|
||||
backtracking(board)
|
||||
}
|
||||
|
||||
def backtracking(board: Array[Array[Char]]): Boolean = {
|
||||
for (i <- 0 until 9) {
|
||||
for (j <- 0 until 9) {
|
||||
if (board(i)(j) == '.') { // 必须是为 . 的数字才放数字
|
||||
for (k <- '1' to '9') { // 这个位置放k是否合适
|
||||
if (isVaild(i, j, k, board)) {
|
||||
board(i)(j) = k
|
||||
if (backtracking(board)) return true // 找到了立刻返回
|
||||
board(i)(j) = '.' // 回溯
|
||||
}
|
||||
}
|
||||
return false // 9个数都试完了,都不行就返回false
|
||||
}
|
||||
}
|
||||
}
|
||||
true // 遍历完所有的都没返回false,说明找到了
|
||||
}
|
||||
|
||||
def isVaild(x: Int, y: Int, value: Char, board: Array[Array[Char]]): Boolean = {
|
||||
// 行
|
||||
for (i <- 0 until 9 ) {
|
||||
if (board(i)(y) == value) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// 列
|
||||
for (j <- 0 until 9) {
|
||||
if (board(x)(j) == value) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// 宫
|
||||
var row = (x / 3) * 3
|
||||
var col = (y / 3) * 3
|
||||
for (i <- row until row + 3) {
|
||||
for (j <- col until col + 3) {
|
||||
if (board(i)(j) == value) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
遵循Scala至简原则写法:
|
||||
```scala
|
||||
object Solution {
|
||||
|
||||
def solveSudoku(board: Array[Array[Char]]): Unit = {
|
||||
backtracking(board)
|
||||
}
|
||||
|
||||
def backtracking(board: Array[Array[Char]]): Boolean = {
|
||||
// 双重for循环 + 循环守卫
|
||||
for (i <- 0 until 9; j <- 0 until 9 if board(i)(j) == '.') {
|
||||
// 必须是为 . 的数字才放数字,使用循环守卫判断该位置是否可以放置当前循环的数字
|
||||
for (k <- '1' to '9' if isVaild(i, j, k, board)) { // 这个位置放k是否合适
|
||||
board(i)(j) = k
|
||||
if (backtracking(board)) return true // 找到了立刻返回
|
||||
board(i)(j) = '.' // 回溯
|
||||
}
|
||||
return false // 9个数都试完了,都不行就返回false
|
||||
}
|
||||
true // 遍历完所有的都没返回false,说明找到了
|
||||
}
|
||||
|
||||
def isVaild(x: Int, y: Int, value: Char, board: Array[Array[Char]]): Boolean = {
|
||||
// 行,循环守卫进行判断
|
||||
for (i <- 0 until 9 if board(i)(y) == value) return false
|
||||
// 列,循环守卫进行判断
|
||||
for (j <- 0 until 9 if board(x)(j) == value) return false
|
||||
// 宫,循环守卫进行判断
|
||||
var row = (x / 3) * 3
|
||||
var col = (y / 3) * 3
|
||||
for (i <- row until row + 3; j <- col until col + 3 if board(i)(j) == value) return false
|
||||
true // 最终没有返回false,就说明该位置可以填写true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
Reference in New Issue
Block a user