Question
Sudoku is a number-placement puzzle. The objective is to fill a 9 × 9
grid with numbers in such a way that each column, each row, and each of the nine 3 × 3
sub-grids that compose the grid all contain all of the numbers from 1
to 9
one time.
Implement an algorithm that will check whether the given grid
of numbers represents a valid Sudoku puzzle according to the layout rules described above. Note that the puzzle represented by grid
does not have to be solvable.
Example
-
For
grid = [['.', '.', '.', '1', '4', '.', '.', '2', '.'], ['.', '.', '6', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '1', '.', '.', '.', '.', '.', '.'], ['.', '6', '7', '.', '.', '.', '.', '.', '9'], ['.', '.', '.', '.', '.', '.', '8', '1', '.'], ['.', '3', '.', '.', '.', '.', '.', '.', '6'], ['.', '.', '.', '.', '.', '7', '.', '.', '.'], ['.', '.', '.', '5', '.', '.', '.', '7', '.']]
the output should be
solution(grid) = true
; -
For
grid = [['.', '.', '.', '.', '2', '.', '.', '9', '.'], ['.', '.', '.', '.', '6', '.', '.', '.', '.'], ['7', '1', '.', '.', '7', '5', '.', '.', '.'], ['.', '7', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '8', '3', '.', '.', '.'], ['.', '.', '8', '.', '.', '7', '.', '6', '.'], ['.', '.', '.', '.', '.', '2', '.', '.', '.'], ['.', '1', '.', '2', '.', '.', '.', '.', '.'], ['.', '2', '.', '.', '3', '.', '.', '.', '.']]
the output should be
solution(grid) = false
.The given
grid
is not correct because there are two1
s in the second column. Each column, each row, and each3 × 3
subgrid can only contain the numbers1
through9
one time.
Input/Output
-
[execution time limit] 4 seconds (py3)
-
[memory limit] 1 GB
-
[input] array.array.char grid
A
9 × 9
array of characters, in which each character is either a digit from'1'
to'9'
or a period'.'
. -
[output] boolean
Return
true
ifgrid
represents a valid Sudoku puzzle, otherwise returnfalse
.
Answer python
def solution(grid):
# Check rows
for row in grid:
if not is_valid(row):
return False
# Check columns
for col in range(9):
column = [grid[row][col] for row in range(9)]
if not is_valid(column):
return False
# Check sub-grids
for row in range(0, 9, 3):
for col in range(0, 9, 3):
subgrid = [
grid[r][c]
for r in range(row, row + 3)
for c in range(col, col + 3)
]
if not is_valid(subgrid):
return False
return True
def is_valid(group):
numbers = set()
for num in group:
if num != '.':
if num in numbers:
return False
numbers.add(num)
return True