Fase 1 com DFS: cada terra sem rótulo inicia uma dfs(r, c, id) que pinta a ilha
inteira com id (2, 3, ...) e devolve a área somando o que cada vizinho retorna. O rótulo fica na própria
grade e também serve de "visitado". A call stack guarda o caminho de volta.
Fase 2 (igual nas duas abas): para cada 0, junta num Set os rótulos
das ilhas vizinhas e soma 1 + area[id] de cada uma. O Set é a armadilha clássica: a
mesma ilha pode encostar no 0 por dois lados (veja o 0 do meio, tocado pela ilha 2 por cima e pela esquerda) e somá-la
duas vezes daria uma área maior do que a real.
tempo O(n²)espaço O(n²)Fase 1 rotula cada célula uma vez; fase 2 olha 4 vizinhos de cada 0. Rótulos na própria grade, áreas por id e call stack.
grade
terra sem rótulo (1)
ilha 2
ilha 3
célula atual
vizinho
memória · grade no heap (row-major)
Os rótulos sobrescrevem a grade: nenhum array visited extra. Além da grade, só o mapa
area (uma entrada por ilha) e a call stack, O(n²) no pior caso.
Fase 1 com BFS: cada terra sem rótulo vira a semente de uma fila. Cada célula que sai da
fila soma 1 em area[id] e enfileira os vizinhos de terra, que são rotulados ao entrar na fila,
senão poderiam ser contados duas vezes. Sem recursão: a call stack fica vazia.
Fase 2 (igual nas duas abas): para cada 0, junta num Set os rótulos
das ilhas vizinhas e soma 1 + area[id] de cada uma. O Set é a armadilha clássica: a
mesma ilha pode encostar no 0 por dois lados (veja o 0 do meio, tocado pela ilha 2 por cima e pela esquerda) e somá-la
duas vezes daria uma área maior do que a real.
tempo O(n²)espaço O(n²)Mesmas duas fases; a fila substitui a call stack.
grade
terra sem rótulo (1)
ilha 2
ilha 3
célula atual
vizinho
fila · heap
head = próximo a sair · tail = último a entrar · apagados já saíram da fila.
memória · grade no heap (row-major)
Grade rotulada no lugar. Espaço extra: a fila da ilha atual e o mapa area.