CodeSignal-Arrays(4):sudoku2

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 two 1s 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

    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.

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

你可能感兴趣的:(CodeSignal,python,开发语言,leetcode,算法)