Défi de Clem // Percolation // un exemple de code dans un langage 'atypique'.

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Voici un exemple de solution au défi 'Percolation', en langage Windev :

Code d'initialisation de la fenêtre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
PROCEDURE MaFenêtre()
nlig, ncol est un entier
la0, ha0 est un entier      // utile uniquement pour la représentation dans le champ image. 
n_arbres_initial est un entier
n_arbres_brules est un entier

pct_clairiere est un réel
pct_p est un réel

tb est un tableau dynamique // Etat de chaque case ( ou encore de chaque arbre)

q_etat est une Enumération
    clairiere
    Arbre_sain
    arbre_en_feu
    arbre_en_cendres
FIN
liste_arbres_en_feu est un tableau de 0 par 2 entiers

Code du bouton 'Go' :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
i,j est un entier
r est un réel
i1,j1 , i2,j2  est un entier

nlig = 200 
ncol = 200
la0 = PartieEntière(Image1..Largeur  / ncol)
ha0 = PartieEntière(Image1..Hauteur  / nlig)
Image1..Largeur = la0 * ncol
Image1..Hauteur = ha0 * nlig

pct_p = 0.59
i = Saisie( " Donnez-le pourcentage de propagation du feu d'un arbe à l'autre",pct_p )
SI i = -1 ALORS RENVOYER Faux  // L'utilisateur a cliqué sur Annuler
SI pct_p < 0 _OU_ pct_p > 1 ALORS 
    Erreur ( " Le nombre saisi est uinvalide "," Abandon ") 
    RENVOYER Faux
FIN

pct_clairiere = 0.02
i = Saisie( " Donnez-le pourcentage de clairiere dans la grille ",pct_clairiere )
SI i = -1 ALORS RENVOYER Faux  // L'utilisateur a cliqué sur Annuler
SI pct_clairiere < 0 _OU_ pct_clairiere > 1 ALORS 
    Erreur ( " Le nombre saisi est uinvalide "," Abandon ") 
    RENVOYER Faux
FIN

tb = allouer un tableau de nlig par ncol q_etat
// Initialisation clairiere // Arbre
InitHasard( HeureVersEntier(HeureSys()))
dDébutDessin(Image1)

n_arbres_initial = 0
POUR i = 1 _A_ nlig
    POUR j = 1 _A_ ncol
        r = Hasard()
        SI r > pct_clairiere ALORS 
            tb[i,j]= Arbre_sain
            n_arbres_initial ++
        SINON
            tb[i,j] = clairiere
        FIN
        f_dessine(i,j )
    FIN
FIN
SI n_arbres_initial = 0 ALORS 
    Erreur ( " Aucun arbre, uniquement de la clairiere ! ", "fin du traitement")
    RENVOYER Faux
FIN

// Choisir un arbre  où le feu se déclenche
i1 = Hasard(nlig)
j1 = Hasard(ncol)
TANTQUE tb[i1,j1] <> Arbre_sain  // Boucle 
    i1 = Hasard(nlig)
    j1 = Hasard(ncol)
FIN
tb[i1,j1]= arbre_en_feu
TableauSupprimeTout(liste_arbres_en_feu)
TableauAjouteLigne(liste_arbres_en_feu,i1,j1)
f_dessine(i1,j1)
n_arbres_brules =1


// Et debut de la propagation
TANTQUE TableauOccurrence( liste_arbres_en_feu) > 0
    // Je prends le premier arbre, je prends ses 4 voisins, et je propage le feu, avec une probablilité p
    i1 = liste_arbres_en_feu[1,1]
    j1 = liste_arbres_en_feu[1,2]
    TableauSupprimeLigne(liste_arbres_en_feu,1)
    POUR direction  = 1 A 4
        SELON direction
            CAS 1 
                i2=i1+1  ;  j2= j1
            CAS 2 
                i2=i1-1  ;  j2= j1
            CAS 3 
                i2=i1  ;  j2= j1 -1
            CAS 4 
                i2=i1  ;  j2= j1+1
            AUTRE CAS   
        FIN
        // Ici, on pourrait aménager pour traiter le cas du tore.
        SI i2 > 0 _ET_ i2<= nlig _ET_ j2 > 0 _ET_ j2 <= ncol ALORS
            SI tb[i2,j2] = Arbre_sain ALORS 
                r = Hasard()
                SI r <= pct_p ALORS 
                    tb[i2,j2] = arbre_en_feu
                    f_dessine(i2,j2)
                    TableauAjouteLigne(liste_arbres_en_feu,i2,j2) 
                    n_arbres_brules++
                FIN
            FIN
        FIN
    FIN
    tb[i1,j1]= arbre_en_cendres
    f_dessine(i1,j1)
FIN
Info( n_arbres_brules, n_arbres_initial)

Code de la fonction de dessin, pour visualiser la progression du feu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
PROCEDURE f_dessine(i,j)
coul est un entier
qq est un q_etat
qq= tb[i,j]
SELON qq
    CAS clairiere
        coul = JauneClair
    CAS Arbre_sain
        coul = VertClair
    CAS arbre_en_feu
        coul = RougeClair
    CAS arbre_en_cendres
        coul = GrisFoncé    
FIN
dRectangle(  (j-1)* la0, ( i-1)*ha0, j*la0,i*ha0, coul,coul)
MultitâcheRepeint()
RENVOYER Vrai

Et une image, en cours de traitement (certains arbres sont encore en feu / en rouge sur le dessin). percolation

+3 -0

Ça me fait penser à quand on brule une feuille de papier, puis qu'on éteint le feu mais en laissant des braises. Les braises continuent de consumer le papier… bref, la forme, etc. m'y fait penser un peu.

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte