Relatório técnico

Pentamino Lab — Grafos, Buscas e AVL

Disciplina: Estruturas de Dados e Análise de Algoritmos

1. Modelagem do problema como grafo

O puzzle de pentaminós é modelado como um grafo implícito de estados. Cada nó é um estado (PuzzleState) contendo o tabuleiro parcial e as peças usadas. Cada aresta representa o posicionamento válido de uma peça em uma orientação e posição. Resolver o puzzle equivale a encontrar um caminho do estado inicial (tabuleiro vazio) até um estado final (tabuleiro completo).

2. Representação do tabuleiro

Matriz Cell[][] onde cada célula é "." (vazia) ou o ID da peça que a cobre. Funções principais: makeBoard, canPlace, placePiece,removePiece, isComplete, regionsDivisibleBy5.

3. Representação das peças

As 12 pentaminós (F, I, L, N, P, T, U, V, W, X, Y, Z) são definidas por coordenadas relativas. Cada peça contém todas as orientações únicas pré-computadas.

4. Geração de rotações e reflexões

rotate(shape) aplica (r,c) → (c, -r). reflect(shape) aplica (r,c) → (r, -c).normalize(shape) traduz para origem e ordena. generateOrientationscombina 4 rotações × 2 reflexões e remove duplicatas via shapeKey.

5. Implementação da DFS

Pilha explícita; expande o último estado inserido. Verifica AVL antes de inserir filhos (poda por estado já visto). Respeita MaxStates, registra profundidade máxima e pico da pilha. Para se findAll=false ao achar primeira solução.

6. Implementação da BFS

Fila FIFO; explora nível a nível, garantindo solução de menor profundidade. Mesma poda via AVL e mesmas métricas que DFS, mais o pico da fila.

7. Implementação da AVL

Árvore AVL implementada do zero (arquivo core/avl.ts). Nós contêm chave string e altura. Rotações simples (LL, RR) e duplas (LR, RL). Métricas internas: insertions, searches, rotations,size, height(). A AVL garante busca O(log n) para detectar estados visitados, evitando explosão combinatória.

8. Serialização dos estados

Cada estado é serializado de forma determinística:linha0/linha1/.../linhaN|peca1,peca2,.... A ordenação das peças usadas garante chaves únicas para estados equivalentes.

9. Análise de desempenho

Tabuleiros maiores que 6×10 sem heurística costumam estourar MaxStates. A heurística "primeira célula vazia" reduz drasticamente o fator de ramificação, pois força que a próxima peça cubra a célula vazia mais à esquerda/topo. A poda por região (regiões vazias com tamanho não múltiplo de 5 são impossíveis) também reduz estados gerados.

10. Comparação entre DFS e BFS

DFS atinge profundidade máxima rapidamente e tende a achar uma solução com menos memória (pilha O(profundidade)). BFS garante solução de menor profundidade mas armazena toda a "fronteira", crescendo exponencialmente. Para encontrar QUALQUER solução de pentaminós, DFS é tipicamente mais eficiente em memória; BFS é melhor para análises de grafo por níveis. A página Laboratório mostra esses números lado a lado.

11. Dificuldades e soluções

O maior desafio foi controlar a explosão de estados. Soluções aplicadas: AVL para deduplicação O(log n), poda por regiões inválidas, heurística opcional de primeira célula vazia, e parâmetro MaxStates com mensagem clara de interrupção.

12. Uso de IA

Assistente de IA foi usado para apoio na estruturação do projeto, revisão das funções de rotação/reflexão e na geração da UI. Toda a lógica algorítmica (AVL, DFS, BFS, geração de vizinhos) foi implementada explicitamente e revisada manualmente.