2021-09-22:请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 '.' 表示。注意:一个有效的数独(部分已被填充)不一定是可解的。只需要根据以上规则,验证已经填入的数字是否有效即可。
福大大 答案2021-09-22:
同行同列同宫。重复出现,返回false;否则返回true。
时间复杂度:O(1)。
空间复杂度:O(1)。
代码用golang编写。代码如下:
package main import "fmt" func main() { board := [][]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'}, } ret := isValidSudoku(board) fmt.Println(ret) } func isValidSudoku(board [][]byte) bool { row := make([][]bool, 9) for i := 0; i < 9; i++ { row[i] = make([]bool, 10) } col := make([][]bool, 9) for i := 0; i < 9; i++ { col[i] = make([]bool, 10) } bucket := make([][]bool, 9) for i := 0; i < 9; i++ { bucket[i] = make([]bool, 10) } for i := 0; i < 9; i++ { for j := 0; j < 9; j++ { bid := 3*(i/3) + (j / 3) if board[i][j] != '.' { num := board[i][j] - '0' if row[i][num] || col[j][num] || bucket[bid][num] { return false } row[i][num] = true col[j][num] = true bucket[bid][num] = true } } } return true }
执行结果如下: