Este proyecto modela y resuelve el Picross (también conocido como Nonograma) y sus variaciones avanzadas (Color Picross y Mega Picross) como Problemas de Satisfacción de Restricciones (CSP) usando Google OR-Tools en Python. El Picross es un puzzle lógico donde se deben pintar celdas en una cuadrícula siguiendo pistas numéricas para revelar una imagen oculta. El objetivo es implementar solvers eficientes que encuentren la configuración única que satisface todas las restricciones del puzzle.
Modelar y resolver diferentes variaciones del Picross mediante Programación por Restricciones (CP) con OR-Tools, demostrando cómo técnicas de CSP pueden abordar puzzles lógicos de complejidad creciente.
- Comprender el Picross como un Problema de Satisfacción de Restricciones y sus diferencias con problemas de optimización.
- Conocer el rol de los solvers de CP (propagación de restricciones, búsqueda y heurísticas) en la resolución de puzzles lógicos.
- Implementar modelos eficientes en OR-Tools que capturen las restricciones específicas de cada variación.
- Comparar la complejidad computacional entre Picross regular, Color Picross y Mega Picross.
- Generar visualizaciones gráficas de las soluciones encontradas.
- Cuadrícula: n×m celdas (binarias: pintada o vacía)
- Pistas: Números en filas y columnas que indican grupos consecutivos de celdas pintadas
- Restricciones:
- Cada grupo de celdas consecutivas debe estar separado por al menos una celda vacía
- Todas las pistas de filas y columnas deben satisfacerse simultáneamente
- Ejemplo resuelto: Tablero 15×20 con 314 celdas pintadas
- Extensión: Múltiples colores además de pintado/vacío
- Pistas: Incluyen tanto el número como el color de cada grupo
- Complejidad adicional:
- Grupos de diferentes colores deben estar separados por al menos una celda vacía
- Aumenta exponencialmente el espacio de búsqueda
- Ejemplo resuelto: Tablero 10×10 con 3 colores
- Innovación: Pistas "mega" que abarcan dos líneas adyacentes simultáneamente
- Restricción especial: Los grupos mega deben formar regiones conectadas que pueden moverse entre ambas líneas (horizontal y verticalmente)
- Complejidad: Los patrones pueden formar formas no lineales (L, T, zigzag)
- Ejemplo resuelto: Tablero 5×5 con restricciones mega en filas 2-3 y columnas 0-1
- Variables: Una variable por celda representando su estado (vacía/pintada o color)
- Dominio:
- Picross regular: {0, 1}
- Color Picross: {0, 1, 2, ..., k} donde k = número de colores
- Mega Picross: {0, 1} con restricciones adicionales de conectividad
- Restricciones: Expresadas mediante patrones válidos (
AddAllowedAssignments)
Cada variación implementa su propia lógica:
- Algoritmo: Backtracking para generar todas las configuraciones válidas
- Entrada: Longitud de línea y secuencia de pistas
- Salida: Lista de tuplas representando patrones válidos
- Ejemplo: Para longitud 5 y pistas [1,1] → 6 patrones posibles
- Extensión: Similar al regular pero considerando colores
- Restricción adicional: Grupos de diferentes colores separados por vacíos
- Complejidad: O(n^k) donde k = número de grupos
- Innovación clave: Verifica conectividad de celdas entre dos líneas
- Algoritmo:
- Generar todas las combinaciones de k celdas en 2n posiciones
- Verificar conectividad mediante DFS (Depth-First Search)
- Filtrar solo patrones donde celdas forman componente conexo
- Conectividad: Las celdas pueden conectarse horizontal o verticalmente
- Complejidad: Exponencial - para 5 celdas entre 2 líneas de longitud 5 → 44 patrones válidos
- Propagación de restricciones: Reduce el espacio de búsqueda eliminando valores inconsistentes
- Búsqueda inteligente: Emplea heurísticas para explorar el espacio de soluciones eficientemente
- AddAllowedAssignments: Restricción que fuerza variables a tomar valores de un conjunto predefinido de tuplas
- Matplotlib: Generación de gráficos del tablero con:
- Celdas pintadas/coloreadas según la solución
- Pistas mostradas en los márgenes
- Bordes y separaciones claras
- Complejidad: 314 celdas pintadas de 300 totales
- Tiempo de resolución: < 1 segundo
- Patrones generados: ~1000 patrones válidos en total
- Imagen revelada: Castillo pixelado
- Complejidad: 3 colores (rojo, verde, azul)
- Tiempo de resolución: ~5 segundos
- Espacio de búsqueda: 3^100 ≈ 5×10^47 configuraciones teóricas
- Imagen revelada: Pingüino con patrones de color pixelado
- Restricciones mega: 2 pares (filas 2-3, columnas 0-1)
- Patrones mega generados: 44 para columnas, 55 para filas
- Tiempo de resolución: < 1 segundo
- Verificación: Grupos conectados correctamente distribuidos entre líneas adyacentes
- Imagen revelada: Sombrero pixelado
| Variación | Espacio de búsqueda | Patrones típicos/línea | Algoritmo clave | Complejidad temporal |
|---|---|---|---|---|
| Picross Regular | 2^(n×m) | 1-100 | Backtracking | O(n × m × p) |
| Color Picross | k^(n×m) | 10-1000 | Backtracking con colores | O(n × m × p × k^g) |
| Mega Picross | 2^(n×m) × conectividad | 50-500 | Combinatoria + DFS | O(C(2n,k) × k) |
Donde:
- n, m = dimensiones del tablero
- p = número promedio de patrones por línea
- k = número de colores
- g = número de grupos
- C(2n,k) = combinaciones de k elementos en 2n posiciones
- Backtracking: Generación sistemática de patrones válidos
- Depth-First Search (DFS): Verificación de conectividad en Mega Picross
- Constraint Propagation: Reducción del espacio de búsqueda
- Branch and Bound: Exploración inteligente del solver CP-SAT
- Pattern Matching: Uso de
AddAllowedAssignmentspara restricciones complejas
- Modelado declarativo: Expresar el problema como CSP permitió una implementación elegante y mantenible
- Escalabilidad: El enfoque funciona para tableros de diferentes tamaños y complejidades
- Reutilización: El código base del Picross regular se reutiliza en las variaciones
- Trade-off complejidad-flexibilidad: Mayor flexibilidad (colores, mega) implica mayor complejidad computacional
- Aplicabilidad: Las técnicas son generalizables a otros puzzles lógicos (Sudoku, Kakuro, etc.)
- Generación automática de puzzles: Crear Picross con solución única garantizada
- Resolución incremental: Mostrar pasos de razonamiento humano
- Mega Picross extendido: Soportar pistas que abarcan 3+ líneas
- Optimización: Reducir patrones generados mediante heurísticas
- Interfaz interactiva: Aplicación web para jugar y resolver
pip install numpy matplotlib ortoolscd frontend
npm install📁 20252_cst_tf_g3/
├── 📁 frontend/ # Aplicación web interactiva (Next.js)
│ ├── app/ # Páginas y componentes de Next.js
│ ├── package.json # Dependencias del frontend
│ └── .gitignore # Archivos ignorados por git
├── 📓 picross.ipynb # Notebook principal con todas las variaciones
└── 📄 README.md # Este archivo
- Notebook: Abrir
picross.ipynben Jupyter/VS Code y ejecutar las celdas secuencialmente
-
Navegar a la carpeta del frontend:
cd frontend -
Instalar dependencias (solo la primera vez):
npm install
-
Iniciar el servidor de desarrollo:
npm run dev
-
Abrir el navegador en
http://localhost:3000
Características del Frontend:
- 🎮 Interfaz interactiva para visualizar Picross
- 🎨 Visualización en tiempo real de las soluciones
- 🧩 Múltiples ejemplos con diferentes variaciones
- 📊 Estadísticas y seguimiento de progreso
- 🚀 Responsive design para móviles y desktop
| Código | Apellidos y Nombres |
|---|---|
| U202122430 | Ariana Graciela Quelopana Puppo |
| U20221E167 | Liam Mikael Quino Neff |
| U20211c688 | Leonardo Leoncio Bravo Ricapa |
| U202210644 | Nathaly Eliane Anaya Vadillo |