Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e06b53a

Browse files
committed
添加 0037.解数独.md Scala版本
1 parent 87abfa1 commit e06b53a

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

‎problems/0037.解数独.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,5 +602,100 @@ func solveSudoku(_ board: inout [[Character]]) {
602602
}
603603
```
604604

605+
### Scala
606+
607+
详细写法:
608+
```scala
609+
object Solution {
610+
611+
def solveSudoku(board: Array[Array[Char]]): Unit = {
612+
backtracking(board)
613+
}
614+
615+
def backtracking(board: Array[Array[Char]]): Boolean = {
616+
for (i <- 0 until 9) {
617+
for (j <- 0 until 9) {
618+
if (board(i)(j) == '.') { // 必须是为 . 的数字才放数字
619+
for (k <- '1' to '9') { // 这个位置放k是否合适
620+
if (isVaild(i, j, k, board)) {
621+
board(i)(j) = k
622+
if (backtracking(board)) return true // 找到了立刻返回
623+
board(i)(j) = '.' // 回溯
624+
}
625+
}
626+
return false // 9个数都试完了,都不行就返回false
627+
}
628+
}
629+
}
630+
true // 遍历完所有的都没返回false,说明找到了
631+
}
632+
633+
def isVaild(x: Int, y: Int, value: Char, board: Array[Array[Char]]): Boolean = {
634+
//
635+
for (i <- 0 until 9 ) {
636+
if (board(i)(y) == value) {
637+
return false
638+
}
639+
}
640+
641+
//
642+
for (j <- 0 until 9) {
643+
if (board(x)(j) == value) {
644+
return false
645+
}
646+
}
647+
648+
//
649+
var row = (x / 3) * 3
650+
var col = (y / 3) * 3
651+
for (i <- row until row + 3) {
652+
for (j <- col until col + 3) {
653+
if (board(i)(j) == value) {
654+
return false
655+
}
656+
}
657+
}
658+
659+
true
660+
}
661+
}
662+
```
663+
664+
遵循Scala至简原则写法:
665+
```scala
666+
object Solution {
667+
668+
def solveSudoku(board: Array[Array[Char]]): Unit = {
669+
backtracking(board)
670+
}
671+
672+
def backtracking(board: Array[Array[Char]]): Boolean = {
673+
// 双重for循环 + 循环守卫
674+
for (i <- 0 until 9; j <- 0 until 9 if board(i)(j) == '.') {
675+
// 必须是为 . 的数字才放数字,使用循环守卫判断该位置是否可以放置当前循环的数字
676+
for (k <- '1' to '9' if isVaild(i, j, k, board)) { // 这个位置放k是否合适
677+
board(i)(j) = k
678+
if (backtracking(board)) return true // 找到了立刻返回
679+
board(i)(j) = '.' // 回溯
680+
}
681+
return false // 9个数都试完了,都不行就返回false
682+
}
683+
true // 遍历完所有的都没返回false,说明找到了
684+
}
685+
686+
def isVaild(x: Int, y: Int, value: Char, board: Array[Array[Char]]): Boolean = {
687+
// 行,循环守卫进行判断
688+
for (i <- 0 until 9 if board(i)(y) == value) return false
689+
// 列,循环守卫进行判断
690+
for (j <- 0 until 9 if board(x)(j) == value) return false
691+
// 宫,循环守卫进行判断
692+
var row = (x / 3) * 3
693+
var col = (y / 3) * 3
694+
for (i <- row until row + 3; j <- col until col + 3 if board(i)(j) == value) return false
695+
true // 最终没有返回false,就说明该位置可以填写true
696+
}
697+
}
698+
```
699+
605700
-----------------------
606701
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /