• 有效的数独


    请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

    数字 1-9 在每一行只能出现一次。
    数字 1-9 在每一列只能出现一次。
    数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

    注意:

    一个有效的数独(部分已被填充)不一定是可解的。
    只需要根据以上规则,验证已经填入的数字是否有效即可。
    空白格用 '.' 表示。

    示例 1:

    输入:board =
    [["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"]]
    输出:true
    示例 2:

    输入:board =
    [["8","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"]]
    输出:false
    解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
     

    提示:

    board.length == 9
    board[i].length == 9
    board[i][j] 是一位数字(1-9)或者 '.'

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/valid-sudoku
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    func isValidSudoku(board [][]byte) bool {
        boardLength := len(board)
        boardExcept := 3
        for y := 0; y < boardLength; y++ {
            dx := map[byte]int{}
            dy := map[byte]int{}
            for x := 0; x < boardLength; x++ {
                valX := board[y][x]
                if valX != '.' {
                    if _, ok := dx[valX]; ok {
                        return false
                    } else {
                        dx[valX] = 1
                    }
                }
                valY := board[x][y]
                if valY != '.' {
                    if _, ok := dy[valY]; ok {
                        return false
                    } else {
                        dy[valY] = 1
                    }
                }
            }
        }
    
        for c1 := 0; c1 < boardExcept; c1++ {
            lz := [][]byte{}
            for y1 := 0; y1 < boardLength; y1++ {
                if y1/3 == c1 {
                    lz = append(lz, board[y1])
                }
            }
            for c2 := 0; c2 < boardExcept; c2++ {
                dz := map[byte]int{}
                for c3 := 0; c3 < boardExcept; c3++ {
                    for c4 := 0; c4 < boardLength; c4++ {
                        valZ := lz[c3][c4]
                        if c4/3 == c2 {
                            if valZ != '.' {
                                if _, ok := dz[valZ]; ok {
                                    return false
                                } else {
                                    dz[valZ] = 1
                                }
                            }
                        }
                    }
                }
            }
            
        }
    
        return true
    }
    class Solution:
        def isValidSudoku(self, board: List[List[str]]) -> bool:
            for y in range(9):
                lx = {}
                ly = {}
                for x in range(9):
                    valX = board[y][x]
                    if valX != ".":
                        if lx.get(valX) == None:
                            lx[valX] = 1
                        else:
                            return False
                    valY = board[x][y]
                    if valY != ".":
                        if ly.get(valY) == None:
                            ly[valY] = 1
                        else:
                            return False
            for j in range(3):
                lz1 = []
                for i in range(9):
                    if i // 3 == j:
                        lz1.append(board[i])
                for m in range(3):
                    lz2 = []
                    for k in range(3):
                        for n in range(9):
                            if n // 3 == m and lz1[k][n] != ".":
                                if lz1[k][n] in lz2:
                                    return False
                                else:
                                    lz2.append(lz1[k][n])                        
            return True
                            

     结束!

  • 相关阅读:
    Java基础之:构造方法(构造器)与this关键字
    Java基础之:属性与局部变量作用域
    Java基础之:方法重载与可变参数
    Java基础之:成员方法与传参机制
    Java基础之:类与对象
    Java基础之:数组练习题
    Java基础之:二维数组
    Promise对象的简单用法
    如何用vue-cli初始化一个vue项目
    get和post请求的区别
  • 原文地址:https://www.cnblogs.com/aaronthon/p/16172058.html
Copyright © 2020-2023  润新知