Célula de Sudoku

Um quebra-cabeça de Sudoku contém 81 "células" de números em uma grade 9 x 9. Uma abordagem útil para resolver um quebra-cabeça de Sudoku é criar uma classe que represente cada célula do quebra-cabeça junto com três formatos diferentes do quebra-cabeça de Sudoku que representem cada tipo de região:

  • linha
  • coluna
  • bloco

Tenha em mente que a definição da região de uma célula é a seguinte:

  • Cada célula tem uma "região" que contém todos os valores na linha, na coluna e no bloco da célula excluindo a própria célula.

Tarefa I

Crie uma classe Cell com os seguintes atributos:

  • val: O valor da célula.
  • rLocation: A localização da célula em rowData com o formato (r0, r1).

A classe deve ter os seguintes métodos:

  • convIndices(): converte os índices de linha para os formatos de índice de coluna e bloco.
  • getRegions(regionData): obtém a região da célula.

Tarefa II

Crie uma função getRegionData(puzzle):

  • A função deve retornar uma lista contendo três representações regionais diferentes do quebra-cabeça (conforme descrito abaixo).
  • A função deve criar e armazenar instâncias de Cell em cada lista aninhada.

Formato do quebra-cabeça

O quebra-cabeça de Sudoku será formatado em uma lista 9 x 9, em que cada lista aninhada é uma linha do quebra-cabeça:

puzzle = [
  [0, 0, 0, 0, 0, 0, 9, 0, 6],
  [3, 0, 2, 0, 6, 0, 0, 0, 0],
  [8, 0, 0, 7, 0, 3, 0, 0, 5],
  [0, 0, 3, 9, 0, 6, 0, 0, 0],
  [6, 0, 0, 0, 5, 0, 0, 0, 0],
  [0, 0, 4, 8, 0, 1, 0, 0, 0],
  [7, 0, 0, 4, 0, 8, 0, 0, 2],
  [5, 0, 8, 0, 9, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 7, 0, 1]
]

Nota: Os zeros representam células não resolvidas.

A função getRegionData(puzzle)

Esta função deve retornar uma lista contendo as três listas que representam os diferentes tipos de região do quebra-cabeça. Para estes fins, essas listas serão chamadas de:

  • rowData: mesmo formato que puzzle.
  • colData: lista 2D de colunas.
  • boxData: lista 2D de blocos ordenados conforme mostrado abaixo.
012
345
678

Nota: Cada bloco contém outro bloco 3 x 3 ordenado da mesma forma que seu contêiner. Os números mostrados acima representam índices que correspondem à seguinte estrutura de lista:

  • [[0], ... , [8]] em que cada lista aninhada é [0, ... , 8]

O método convIndices()

Este método deve ser chamado na inicialização e criar dois novos atributos:

  • cLocation: a localização da célula em colData com o formato (c0, c1)
  • bLocation: a localização da célula em boxData com o formato (b0, b1)

Dica: rowData[r0][r1] = colData[c0][c1] = boxData[b0][b1]

Exemplo #1

cell = Cell(_, (1, 2))

cell.rLocation
(1, 2)

cell.cLocation
(2, 1)

cell.bLocation
(0, 5)

O método getRegions(regionData)

Este método deve receber regionData e criar um novo atributo:

  • regions: uma lista 2D contendo a região de linha, coluna e bloco da célula.

Nota: A região de cada célula deve conter instâncias de Cell excluindo a célula.

Exemplo #2

regionData = getRegionData(puzzle)
cell.getRegions(regionData)

cell.regions
[[row region], [col region], [box region]]

Observações

N/A