-
Notifications
You must be signed in to change notification settings - Fork 1
/
valid_soduku.py
68 lines (61 loc) · 2.46 KB
/
valid_soduku.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import unittest
from typing import List
# 可以认为题目给的数独矩阵就是固定9x9的大小
class SodukuUsed:
def __init__(self):
self.rows, self.cols, self.boxs = [], [], []
for _ in range(9):
self.rows.append(set())
self.cols.append(set())
# box表示一个九宫格
self.boxs.append(set())
class Solution(unittest.TestCase):
TEST_CASES = [
([
["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),
([
["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),
]
def test(self):
for board, is_valid in self.TEST_CASES:
self.assertEqual(is_valid, self.f(board))
@staticmethod
def f(board: List[List[str]]) -> bool:
# 本题难点在于判断i和j落入了哪一个九宫格
used = SodukuUsed()
for i in range(9):
for j in range(9):
val = board[i][j]
if val == '.':
continue
if val in used.rows[i]:
return False
if val in used.cols[j]:
return False
# for i in range(9): print(i // 3 * 3)
# 0 0 0 3 3 3 6 6 6
box_index = (i // 3) * 3 + j // 3
if val in used.boxs[box_index]:
return False
used.rows[i].add(val)
used.cols[j].add(val)
used.boxs[box_index].add(val)
return True