Loading

Leetcode - 36. 有效的数独

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

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 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] 是一位数字或者 '.'

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

解1 2021/9/1 O(n2)

import numpy as np

def isvalid_hanglie(l:list)->bool:
    # 1*9
    d=dict()
    for x in l:
        if x=='0': return False
        if x=='.': continue
        if x in d.keys(): return False
        d[x]=1
    return True

def isvalid_unit(l:list)->bool:
    # 3*3
    d=dict()
    for x in range(0,3):
        for y in range(0, 3):
            v=l[x][y]
            if v == '0': return False
            if v == '.': continue
            if v in d.keys(): return False
            d[v]=1
    return True

def isValidSudoku(board: list) -> bool:
    # 9行,9列,9个单元
    # 情况有限,直接遍历
    # 1)行
    # np[0] ~ np[8]
    # 2)列
    # np[:,0] ~ np[:,8]
    # 3)单元
    # np[0:3,0:3]
    # np[0:3,3:6]
    # np[0:3,6:9]
    # np[3:6,0:3]
    # np[3:6,3:6]
    # np[3:6,6:9]
    # np[6:9,0:3]
    # np[6:9,3:6]
    # np[6:9,6:9]
    grid=np.zeros(shape=(9,9),dtype=str)
    for x in range(0,9):
        for y in range(0,9):
            grid[x][y]=board[x][y]
    for x in range(0,9):
        if not isvalid_hanglie(grid[x]): return False
    for x in range(0,9):
        if not isvalid_hanglie(grid[:,x]): return False
    return isvalid_unit(grid[0:3,0:3]) and isvalid_unit(grid[0:3,3:6]) and isvalid_unit(grid[0:3,6:9])\
       and isvalid_unit(grid[3:6,0:3]) and isvalid_unit(grid[3:6,3:6]) and isvalid_unit(grid[3:6,6:9]) \
       and isvalid_unit(grid[6:9,0:3]) and isvalid_unit(grid[6:9,3:6]) and isvalid_unit(grid[6:9,6:9])

if __name__ == '__main__':
    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"]]
    print(isValidSudoku(board))
    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"]]
    print(isValidSudoku(board))
    board =\
         [["5", "3", ".", ".", "7", ".", ".", ".", "."]
        , ["6", ".", ".", "1", "9", "5", ".", ".", "."]
        , [".", "9", "8", ".", ".", ".", ".", "6", "."]
        , ["8", ".", ".", ".", "6", ".", ".", ".", "3"]
        , ["4", ".", "4", "8", ".", "3", ".", ".", "1"]
        , ["7", ".", ".", ".", "2", ".", ".", ".", "6"]
        , [".", "6", ".", ".", ".", ".", "2", "8", "."]
        , [".", ".", ".", "4", "1", "9", ".", ".", "5"]
        , [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
    print(isValidSudoku(board))

posted @ 2021-09-01 12:23  wwcg2235  阅读(26)  评论(0)    收藏  举报