Celda de Sudoku

Un rompecabezas de Sudoku contiene 81 "celdas" de números en una cuadrícula 9 x 9. Un enfoque útil para resolver un rompecabezas de Sudoku es crear una clase que represente cada celda del rompecabezas junto con tres formatos diferentes del rompecabezas de Sudoku que representen cada tipo de región:

  • fila
  • columna
  • bloque

Ten en cuenta que la definición de la región de una celda es la siguiente:

  • Cada celda tiene una "región" que contiene todos los valores de la fila, la columna y el bloque de la celda excluyendo la propia celda.

Tarea I

Crea una clase Cell con los siguientes atributos:

  • val: El valor de la celda.
  • rLocation: La ubicación de la celda en rowData con el formato (r0, r1).

La clase debe tener los siguientes métodos:

  • convIndices(): convierte los índices de fila a formatos de índice de columna y bloque.
  • getRegions(regionData): obtiene la región de la celda.

Tarea II

Crea una función getRegionData(puzzle):

  • La función debe devolver una lista que contenga tres representaciones regionales diferentes del rompecabezas (como se describe a continuación).
  • La función debe crear y almacenar instancias de Cell en cada lista anidada.

Formato del rompecabezas

El rompecabezas de Sudoku tendrá el formato de una lista 9 x 9, donde cada lista anidada es una fila del rompecabezas:

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: Los ceros representan celdas sin resolver.

La función getRegionData(puzzle)

Esta función debe devolver una lista que contenga las tres listas que representan los diferentes tipos de región del rompecabezas. Para estos fines, estas listas se denominarán:

  • rowData: mismo formato que puzzle.
  • colData: lista 2D de columnas.
  • boxData: lista 2D de bloques ordenados como se muestra a continuación.
012
345
678

Nota: Cada bloque contiene otro bloque 3 x 3 ordenado de la misma manera que su contenedor. Los números mostrados arriba representan índices que corresponden a la siguiente estructura de lista:

  • [[0], ... , [8]] donde cada lista anidada es [0, ... , 8]

El método convIndices()

Este método debe llamarse al inicializar y crear dos atributos nuevos:

  • cLocation: la ubicación de la celda en colData con el formato (c0, c1)
  • bLocation: la ubicación de la celda en boxData con el formato (b0, b1)

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

Ejemplo #1

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

cell.rLocation
(1, 2)

cell.cLocation
(2, 1)

cell.bLocation
(0, 5)

El método getRegions(regionData)

Este método debe recibir regionData y crear un atributo nuevo:

  • regions: una lista 2D que contiene la región de fila, columna y bloque de la celda.

Nota: La región de cada celda debe contener instancias de Cell excluyendo la celda.

Ejemplo #2

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

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

Notas

N/A