请编写一个程序,给数独中的剩余的空格填写上数字,保证每一行每一列每一宫都是1-9
空格用字符'.'表示
假设给定的数独只有唯一的解法
思路:第一步遍历找到一个为空的位置,记录他的位置i、j,第二步,记录i、j这个位置对应的行、列和块出现过的数字,第三步,找到没出现过的数字,第四部,把数字填上去然后递归调用。如果有解,就直接返回,如果没有解,把位置填回空格,为什么要把空格再填回去呢?如果不把空格填回去,后面失败再从头开始的时候,就识别不到这些格子是空的了,影响最后结果
package main
/**
*
* @param board char字符型二维数组
* @return void
*/
func solveSudoku(board [][]byte) {
// write code here
solve1(board)
}
func solve1(board [][]byte) bool {
hasSlot := false
i := 0
j := 0
for i = 0; i < 9; i++ {
for j = 0; j < 9; j++ {
if board[i][j] == '.' {
hasSlot = true
break
}
}
if hasSlot {
break
}
}
if !hasSlot {
return true
}
line := make(map[byte]bool, 9)
col := make(map[byte]bool, 9)
piece := make(map[byte]bool, 9)
for m := 0; m < 9; m++ {
//一横行
if board[i][m] != '.' {
line[board[i][m]] = true
}
//一竖列
if board[m][j] != '.' {
col[board[m][j]] = true
}
//一个9宫块
p := i / 3
q := j / 3
for r := p * 3; r < p*3+3; r++ {
for s := q * 3; s < q*3+3; s++ {
if board[r][s] != '.' {
piece[board[r][s]] = true
}
}
}
}
var allNum []int
for m := 49; m <= 57; m++ {
if !line[byte(m)] && !col[byte(m)] && !piece[byte(m)] {
allNum = append(allNum, m)
}
}
for _, k := range allNum {
byteK := byte(k)
board[i][j] = byteK
res := solve1(board)
if res {
return true
}
board[i][j] = '.'
}
return false
}