module · pot de peinture · 15 min

Peindre la case, puis demander la même chose aux voisines.

Une grille, un clic, et la zone se peint case par case pendant que la pile d'appels monte et descend à côté. Dessiner des murs, lancer le pot de peinture, compter les appels en attente ; puis la même règle avec une pile explicite, qui n'a plus de limite mais peint dans un autre ordre.

··

Avec l'outil pot de peinture, cliquer une case blanche y lance le remplissage ; avec l'outil murs, cliquer une case la ferme ou la rouvre. Maj + clic lance le remplissage quel que soit l'outil. Les numéros sont l'ordre de peinture ; « recommencer » relance depuis le dernier clic.

pile d'appels0 cadres

cliquer une case blanche pour lancer le pot de peinture.

appels lancés0cases peintes0appels en attente0en attente, au plus0
à retenir

La règle

Peindre la case, puis remplir ses quatre voisines, haut, droite, bas, gauche. Hors de la grille, mur ou déjà peinte : ne rien faire. C'est le cas de base, et c'est lui qui arrête tout.

La profondeur

Le nombre d'appels en attente au même moment. Sur une zone sans mur, chaque case passe la main à une voisine avant d'avoir fini avec les autres : la pile descend jusqu'à la dernière case sans remonter. 1 600 cases blanches, 1 600 appels en attente, pour 1 000 autorisés par Python.

La pile explicite

La même recherche, où les cases à traiter attendent dans une pile tenue à la main au lieu d'attendre dans des appels. Plus de limite, mais un autre ordre : la dernière voisine empilée sort la première.

def remplir(g, i, j, avant, apres):
    if i < 0 or i >= len(g):
        return
    if j < 0 or j >= len(g[0]):
        return
    if g[i][j] != avant:
        return
    g[i][j] = apres
    remplir(g, i - 1, j, avant, apres)
    remplir(g, i, j + 1, avant, apres)
    remplir(g, i + 1, j, avant, apres)
    remplir(g, i, j - 1, avant, apres)
def remplir_pile(g, i0, j0, avant, apres):
    p = Pile()
    p.empiler((i0, j0))
    while not p.est_vide():
        i, j = p.depiler()
        if i < 0 or i >= len(g) or j < 0 or j >= len(g[0]):
            continue
        if g[i][j] != avant:
            continue
        g[i][j] = apres
        p.empiler((i - 1, j))
        p.empiler((i, j + 1))
        p.empiler((i + 1, j))
        p.empiler((i, j - 1))
retour au labo