有効な一意の番号
1. トピックの説明:
9×9の数独が有効かどうかを判断してください。次のルールに従って、塗りつぶされた数値が有効かどうかを確認するだけで済みます。
- 1 ~ 9 の数字は 1 行に 1 回だけ表示できます。
- 1 ~ 9 の数字は各列に 1 回だけ表示できます。
- 1 ~ 9 の数字は、太い実線で区切られた 3x3 ハウスごとに 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:
- 入力:
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