题目:
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3×3 宫内只能出现一次。(请参考示例图)
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 空白格用 ‘.’ 表示。
解题:
按给出来的方式验证就可以
代码:
func isValidSudoku(board [][]byte) bool {
var tmp map[byte]byte
for i := 0; i < 9; i++ {
tmp = map[byte]byte{}
for j := 0; j < 9; j++ {
if board[i][j] == '.' {
continue
}
if _, ok := tmp[board[i][j]]; ok {
return false
} else {
tmp[board[i][j]] = board[i][j]
}
}
tmp = map[byte]byte{}
for j := 0; j < 9; j++ {
if board[j][i] == '.' {
continue
}
if _, ok := tmp[board[j][i]]; ok {
return false
} else {
tmp[board[j][i]] = board[j][i]
}
}
}
for i := 0; i < 9; i += 3 {
for j := 0; j < 9; j += 3 {
tmp = map[byte]byte{}
for k := 0; k < 3; k++ {
for l := 0; l < 3; l++ {
if board[i+k][j+l] == '.' {
continue
}
if _, ok := tmp[board[i+k][j+l]]; ok {
return false
} else {
tmp[board[i+k][j+l]] = board[i+k][j+l]
}
}
}
}
}
return true
}
官方解答:
// 一次遍历
func isValidSudoku(board [][]byte) bool {
var rows, columns [9][9]int
var subboxes [3][3][9]int
for i, row := range board {
for j, c := range row {
if c == '.' {
continue
}
index := c - '1'
rows[i][index]++
columns[j][index]++
subboxes[i/3][j/3][index]++
if rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i/3][j/3][index] > 1 {
return false
}
}
}
return true
}
自己写的效率有点低,数学是真的重要
123