_CountingStars
有效的数独 go 语言实现
package main
import (
"fmt"
)
func hasRepeatedNumbers(numbers []byte) bool {
var numbersExistFlag [9]bool
for _, num := range numbers {
if num == '.' {
continue
}
index := num - '0' - 1
if numbersExistFlag[index] {
return true
}
numbersExistFlag[index] = true
}
return false
}
func isValidSudoku(board [][]byte) bool {
sudokuSize := 9
sudokuUnitSize := 3
for _, line := range board {
if hasRepeatedNumbers(line) {
return false
}
}
for columnIndex := 0; columnIndex < sudokuSize; columnIndex++ {
columnNumbers := make([]byte, 0)
for lineIndex := 0; lineIndex < sudokuSize; lineIndex++ {
columnNumbers = append(columnNumbers, board[lineIndex][columnIndex])
}
if hasRepeatedNumbers(columnNumbers) {
return false
}
}
sudokuUnitCountEachLine := sudokuSize / sudokuUnitSize
for i := 0; i < sudokuUnitCountEachLine; i++ {
for j := 0; j < sudokuUnitCountEachLine; j++ {
sudokuUnitNumbers := make([]byte, 0)
for _, line := range board[i*3 : (i+1)*3] {
sudokuUnitNumbers = append(sudokuUnitNumbers, line[j*3:(j+1)*3]...)
}
if hasRepeatedNumbers(sudokuUnitNumbers) {
return false
}
}
}
return true
}
func main() {
testData1 := [][]byte{
{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
{'.', '.', '.', '.', '8', '.', '.', '7', '9'}}
fmt.Println(isValidSudoku(testData1))
}
编辑回复: 感谢您参与春节七天练的活动,为了表彰你在活动中的优秀表现,赠送您每日一课年度会员,我们会在3个工作日之内完成礼品发放,如有问题请咨询小明同学,微信geektime002。