Leetcode36. 有効な一意の番号

1. トピックの説明:

9×9の数独が有効かどうかを判断してください。次のルールに従って、塗りつぶされた数値が有効かどうかを確認するだけで済みます。

  • 1 ~ 9 の数字は 1 行に 1 回だけ表示できます。
  • 1 ~ 9 の数字は各列に 1 回だけ表示できます。
  • 1 ~ 9 の数字は、太い実線で区切られた 3x3 ハウスごとに 1 回だけ表示されます。(サンプル画像をご参照ください)

知らせ:

  • 有効な (部分的に埋められた) 数独は必ずしも解けるとは限りません。
  • 入力した数値が上記のルールに従って有効であるかどうかを確認するだけで済みます。
  • 空白セルは「.」で表されます。
  1. 例 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. 例 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 が 2 つあるため、この数独は無効です。
  • ヒント:
    • ボードの長さ == 9
    • ボード[i].length == 9
    • board[i][j] は 1 桁の数字 (1 ~ 9) または「.」です。

2. ソリューションとコード

1. 解決策

  • 分析: この質問では、i 番目の行、j 番目の列にあるboard[i][j] の数と、3x3 グリッド内の出現数を数えます。すべての数字が 1 回だけ出現する場合、それは問題です。有効な一意の番号。ここでは 3x3 グリッドを考慮する必要があります。行と列を通じて対応する 3x3 グリッドを計算するにはどうすればよいでしょうか? 3x3 グリッドの k 番目のグリッドの場合、k = i / / ( row / / 3 ) ∗ (col / / 3 ) + j / / 3 k=i//(row//3)*(col// 3)+j//3k=i // (w //3 )( co l //3 )+j //3

2. コード

from typing import *
class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:        
        x33 = {
    
    0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[]}
        col = {
    
    0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[]}
        for i in range(len(board)):
            row = []
            for j in range(len(board[0])):
                if board[i][j]=='.': continue

                if board[i][j] in row: return False
                row.append(board[i][j])
                
                if board[i][j] in col[j]: return False
                col[j].append(board[i][j])
                
                if board[i][j] in x33[i//3*3+j//3]: return False
                x33[i//3*3+j//3].append(board[i][j])
        return True

おすすめ

転載: blog.csdn.net/qq_40541102/article/details/130220187