暴搜,具体看代码注释。
package main
import (
"bufio"
"fmt"
"os"
)
var jg [][]int
var bj bool
func check(x, y, v int) bool { //检查数字能不能填进去
for i := 1; i <= 9; i++ {
if jg[x][i] == v {
return false
}
}
for i := 1; i <= 9; i++ {
if jg[i][y] == v {
return false
}
}
h, s := (x-1)/3*3+1, (y-1)/3*3+1
for i := h; i < h+3; i++ {
for j := s; j < s+3; j++ {
if jg[i][j] == v {
return false
}
}
}
return true
}
func dfs(x, y int) {
if y == 10 { //纵坐标跑完了横坐标+1,纵坐标回到头
x++
y = 1
}
if x == 10 { //都跑完了,打个标记,后续的回溯不跑了
bj = true
return
}
if jg[x][y] == 0 { //空的格子就尝试
for i := 1; i <= 9; i++ {
if check(x, y, i) { //判断能不能填进去
jg[x][y] = i //填进去继续跑,不行就回溯回来再来一遍
dfs(x, y+1)
if bj {
return
}
jg[x][y] = 0
}
}
} else{ //有数字的格子就跳过
dfs(x, y+1)
}
}
func main() {
in := bufio.NewReader(os.Stdin)
jg = make([][]int, 10)
for i := 1; i <= 9; i++ {
jg[i] = make([]int, 10)
for j := 1; j <= 9; j++ {
fmt.Fscan(in, &jg[i][j])
}
}
dfs(1, 1)
for i := 1; i <= 9; i++ {
for j := 1; j <= 9; j++ {
fmt.Printf("%d ", jg[i][j])
}
fmt.Println()
}
}

京公网安备 11010502036488号