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 besolution(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 besolution(grid) = false
.
The given grid
is not correct because there are two 1
s in the second column. Each column, each row, and each 3 × 3
subgrid can only contain the numbers 1
through 9
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
if grid
represents a valid Sudoku puzzle, otherwise return false
.
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