diff options
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex')
-rw-r--r-- | macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex | 511 |
1 files changed, 511 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex b/macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex new file mode 100644 index 0000000000..a7463ec702 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex @@ -0,0 +1,511 @@ +%%% +% Labyrinthe Nombre +%%% +\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=LightSteelBlue,DoubleOperation=false,Chemin=false,EntreeSortie=false,Entree="Nord",Sortie="Sud",SortieUnique=true} + +\newcommand\LabyNombre[1][]{% + \useKVdefault[ClesLabyNb]% + \setKV[ClesLabyNb]{#1}% + \ifboolKV[ClesLabyNb]{Solution}{% + \TraceLabyFactoSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% + }{% + \TraceLabyFacto{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% + }% +}% + +\newcommand\TraceLabyFacto[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + input PfCLabyNombre; + + boolean Murs; + Murs=\useKV[ClesLabyNb]{Murs}; + + string Entree,Sortie; + Entree=\useKV[ClesLabyNb]{Entree}; + Sortie=\useKV[ClesLabyNb]{Sortie}; + boolean SortieUnique,EntreeSortie; + SortieUnique:=\useKV[ClesLabyNb]{SortieUnique}; + EntreeSortie:=\useKV[ClesLabyNb]{EntreeSortie}; + picture Square; + Square=image( + path Test; + Test=unitsquare scaled 10mm; + trace subpath(0.85,1.15) of Test; + trace subpath(1.85,2.15) of Test; + trace subpath(2.85,3.15) of Test; + trace subpath(3.85,4.15) of Test; + ); + + vardef RemplissagePremier= + Totalpremier:=if indiceChemin<62:62 else: indiceChemin fi; + + numeric p[]; boolean n_is_prime; p[1]=2; kis:=1; + for nis=3 step 2 until infinity: + n_is_prime := true; + for jis=2 upto kis: + if nis mod p[jis]=0: n_is_prime := false; fi + exitif nis/p[jis] < p[jis]; + endfor + if n_is_prime: p[incr kis] := nis; exitif kis=Totalpremier; fi + endfor fi + + numeric PR[],pretiens[]; + + for ki=1 upto Totalpremier-1: + pretiens[ki]:=p[ki+1]; + endfor; + + Kk:=0; + + for ki=Totalpremier-1 downto 1: + alea:=1+floor(uniformdeviate(ki)); + PR[incr Kk]:=pretiens[alea]; + % message("k="&decimal(k)&" alea="&decimal(alea)&" Kk="&decimal(Kk)&" PR[Kk]="&decimal(PR[Kk])); + Kkl:=0; + for li=1 upto ki: + if li<>alea: + pretiens[incr Kkl]:=pretiens[li]; + % message("Kkl="&decimal(Kkl)); + fi; + endfor; + endfor; + enddef; + + numeric Multiple; + Multiple=#1; + % Initialisation du labyrinthe + InitialisationLabyrinthe(#2,#3); + % On initialise les paramètres du parcours + numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; + choixligneD=xpart(#4); + choixcolonneD=ypart(#4); + choixligneA=xpart(#5); + choixcolonneA=ypart(#5);% + pair Depart; + Depart=N[choixligneD][choixcolonneD]; + pair Arrivee; + Arrivee=N[choixligneA][choixcolonneA]; + pair Mobile; + Mobile=Depart; + % + RAZPileChemin; + + if \useKV[ClesLabyNb]{SortieUnique}: + if (Sortie="Est") or (Sortie="Ouest"): + for k=0 upto LargeurLaby-1: + if k<>choixligneA: + CaseExploree[k][choixcolonneA]:=true; + fi; + endfor; + elseif (Sortie="Nord") or (Sortie="Sud"): + for k=0 upto LongueurLaby-1: + if k<>choixcolonneA: + CaseExploree[choixligneA][k]:=true; + fi; + endfor; + fi; + fi; + % Exploration du labyrinthe + if Entree="Nord": + CaseExploree[choixligneD-1][choixcolonneD]:=true; + elseif Entree="Sud": + CaseExploree[choixligneD+1][choixcolonneD]:=true; + elseif Entree="Est": + CaseExploree[choixligneD][choixcolonneD+1]:=true; + elseif Entree="Ouest": + CaseExploree[choixligneD][choixcolonneD-1]:=true; + fi; + % + PushChemin((choixligneD,choixcolonneD)); + CaseExploree[choixligneD][choixcolonneD]:=true; + VoisinDispo(choixligneD,choixcolonneD); + forever: exitif Mobile=Arrivee;%nb=0; + nb:=ceiling(uniformdeviate(nbvoisin)); + if nb>0: + for k=1 upto nbvoisin: + CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; + endfor; + PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); + Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; + VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); + else: + PopCheminMathAlea; + fi; + endfor; + % Affichagefinal + % on sauvegarde les nombres aléatoires + numeric NbAffiche[]; + numeric NbSol[]; + % on écrit des nombres au hasard, mais sans être multiple du nombre choisi + numeric nbaffiche; + nbaffiche=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + if Multiple=1:%On affichera que des multiples de 2/3/5/9/10 pour afficher un chemin de nombre premiers + mathalea:=uniformdeviate(5); + if mathalea<1: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*2; + elseif mathalea<2: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*3; + elseif mathalea<3: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*5; + elseif mathalea<4: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*9; + else: NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*10; + fi; + else: + NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1)); + fi; + endfor; + endfor; + % On crée des multiples du nombre choisi + RemplissagePremier; + + for k=1 upto indiceChemin: + if Multiple>1: + NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple; + else: + NbSol[k]=PR[k]; + fi; + endfor; + % On affiche + picture Corps; + Corps=image( + nbaffiche:=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + for k=1 upto indiceChemin: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + if EntreeSortie=false: + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + trace TraceLabyrinthe; + else: + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + trace Square shifted N[k][l]; + endfor; + endfor; + trace u*(0,0)--u*(LongueurLaby,0)--u*(LongueurLaby,-LargeurLaby)--u*(0,-LargeurLaby)--cycle; + % On dessine l'entrée. + if Entree="Nord": + N[-1][-1]:=Depart+(0,10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(1,4) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Ouest": + N[-1][-1]:=Depart+(-10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(2,5) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(1.15,1.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Sud": + N[-1][-1]:=Depart+(0,-10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(3,6) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(2.15,2.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Est": + N[-1][-1]:=Depart+(10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(0,3) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(3.18,3.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + fi; + % On dessine les sorties + if Sortie="Nord": + N[-2][-2]=Arrivee+(5mm,20mm); + for k=0 upto LongueurLaby-1: + draw ((point(0.15) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + draw ((point(0.85) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted (N[0][k]+(0,10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[0][k]+(0,10mm))); + endfor; + elseif Sortie="Ouest": + N[-2][-2]=Arrivee+(-10mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(1.15) of unitsquare scaled 10mm)--0.5[(point(1.15) of unitsquare scaled 10mm),(point(3.85) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + draw ((point(1.85) of unitsquare scaled 10mm)--0.5[(point(1.85) of unitsquare scaled 10mm),(point(3.15) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + undraw (subpath(1.18,1.82) of unitsquare scaled 10mm) shifted (N[k][0]+(-10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][0]+(-10mm,0))); + endfor; + elseif Sortie="Sud": + N[-2][-2]=Arrivee+(5mm,-10mm); + for k=0 upto LongueurLaby-1: + draw ((point(2.85) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + draw ((point(2.15) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + undraw (subpath(2.18,2.82) of unitsquare scaled 10mm) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm))); + endfor; + elseif Sortie="Est": + N[-2][-2]=Arrivee+(20mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(3.15) of unitsquare scaled 10mm)--0.5[(point(3.15) of unitsquare scaled 10mm),(point(1.85) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + draw ((point(3.85) of unitsquare scaled 10mm)--0.5[(point(3.85) of unitsquare scaled 10mm),(point(1.15) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + undraw (subpath(3.18,3.8) of unitsquare scaled 10mm) shifted (N[k][LongueurLaby-1]+(10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0))); + endfor; + fi; + fi; + ); + Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace Corps; + \end{mplibcode} +} + +\newcommand\TraceLabyFactoSolution[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + color CouleurChemin; + CouleurChemin:=\useKV[ClesLabyNb]{CouleurChemin}; + picture CorpsSolution; + CorpsSolution=image( + nbaffiche:=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + if EntreeSortie=false: + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + else: + for k=1 upto indiceChemin: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + fi; + if EntreeSortie=false: + trace TraceLabyrinthe; + else: + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + trace Square shifted N[k][l]; + endfor; + endfor; + trace u*(0,0)--u*(LongueurLaby,0)--u*(LongueurLaby,-LargeurLaby)--u*(0,-LargeurLaby)--cycle; + % On dessine l'entrée. + if Entree="Nord": + N[-1][-1]:=Depart+(0,10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(1,4) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Ouest": + N[-1][-1]:=Depart+(-10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(2,5) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(1.15,1.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Sud": + N[-1][-1]:=Depart+(0,-10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(3,6) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(2.15,2.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Est": + N[-1][-1]:=Depart+(10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(0,3) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(3.18,3.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + fi; + % On dessine les sorties + if Sortie="Nord": + N[-2][-2]=Arrivee+(5mm,20mm); + for k=0 upto LongueurLaby-1: + draw ((point(0.15) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + draw ((point(0.85) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted (N[0][k]+(0,10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[0][k]+(0,10mm))); + endfor; + elseif Sortie="Ouest": + N[-2][-2]=Arrivee+(-10mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(1.15) of unitsquare scaled 10mm)--0.5[(point(1.15) of unitsquare scaled 10mm),(point(3.85) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + draw ((point(1.85) of unitsquare scaled 10mm)--0.5[(point(1.85) of unitsquare scaled 10mm),(point(3.15) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + undraw (subpath(1.18,1.82) of unitsquare scaled 10mm) shifted (N[k][0]+(-10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][0]+(-10mm,0))); + endfor; + elseif Sortie="Sud": + N[-2][-2]=Arrivee+(5mm,-10mm); + for k=0 upto LongueurLaby-1: + % draw (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withcolor red; + draw ((point(2.85) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + draw ((point(2.15) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + undraw (subpath(2.18,2.82) of unitsquare scaled 10mm) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm))); + endfor; + elseif Sortie="Est": + N[-2][-2]=Arrivee+(20mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(3.15) of unitsquare scaled 10mm)--0.5[(point(3.15) of unitsquare scaled 10mm),(point(1.85) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + draw ((point(3.85) of unitsquare scaled 10mm)--0.5[(point(3.85) of unitsquare scaled 10mm),(point(1.15) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + undraw (subpath(3.18,3.8) of unitsquare scaled 10mm) shifted (N[k][LongueurLaby-1]+(10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0))); + endfor; + fi; + path CheminSolution; + CheminSolution=(N[-1][-1] shifted (5mm,5mm))--((center unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) + for k=2 upto indiceChemin-1: + -- ((center unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) + endfor + --((center unitsquare scaled 10mm) shifted Arrivee)--N[-2][-2]; + trace CheminSolution dashed evenly withcolor CouleurChemin; + fi; + ); + CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace CorpsSolution; + \end{mplibcode} +} + +\newcommand\TraceLabyNombreDouble[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + input PfCLabyNombre; + + boolean Murs; + Murs=\useKV[ClesLabyNb]{Murs}; + + numeric Multiple; + Multiple=#1; + % Initialisation du labyrinthe + InitialisationLabyrinthe(#2,#3); + % On initialise les paramètres du parcours + numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; + choixligneD=xpart(#4); + choixcolonneD=ypart(#4); + choixligneA=xpart(#5); + choixcolonneA=ypart(#5);% + pair Depart; + Depart=N[choixligneD][choixcolonneD]; + pair Arrivee; + Arrivee=N[choixligneA][choixcolonneA]; + pair Mobile; + Mobile=Depart; + RAZPileChemin; + % Exploration du labyrinthe + PushChemin((choixligneD,choixcolonneD)); + CaseExploree[choixligneD][choixcolonneD]:=true; + VoisinDispo(choixligneD,choixcolonneD); + forever: exitif Mobile=Arrivee;%nb=0; + nb:=ceiling(uniformdeviate(nbvoisin)); + if nb>0: + for k=1 upto nbvoisin: + CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; + endfor; + PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); + Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; + VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); + else: + PopChemin; + fi; + endfor; + % Affichagefinal + % on sauvegarde les nombres aléatoires + numeric NbAffiche[]; + numeric NbSol[]; + % on écrit des nombres au hasard, mais sans être multiple du nombre choisi + numeric nbaffiche; + nbaffiche=0; + NbAffiche[0]=5+ceiling(uniformdeviate(7)); + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + mathalea:=uniformdeviate(1); + if mathalea<0.95: + NbAffiche[nbaffiche]=NbAffiche[nbaffiche-1]+Multiple+1; + else: + NbAffiche[nbaffiche]=NbAffiche[nbaffiche-1]*(Multiple-1); + fi; + endfor; + endfor; + % On crée des multiples du nombre choisi + NbSol[1]=5+ceiling(uniformdeviate(7)); + for k=2 upto indiceChemin-1: + mathalea:=uniformdeviate(1); + if mathalea<0.9: + NbSol[k]=NbSol[k-1]+Multiple; + else: + NbSol[k]=NbSol[k-1]*Multiple; + fi; + endfor; + % On affiche + picture Corps; + Corps=image( + nbaffiche:=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + trace TraceLabyrinthe; + ); + Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace Corps; + \end{mplibcode} +} + +\newcommand\TraceDoubleSolution[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + picture CorpsSolution; + CorpsSolution=image( + nbaffiche:=0; + for k=0 upto #3-1: + for l=0 upto #2-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + if \useKV[ClesLabyNb]{Chemin}: + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + endfor; + trace ((center unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) + for k=2 upto indiceChemin-1: + -- ((center unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) + endfor + --((center unitsquare scaled 10mm) shifted Arrivee) dashed evenly withcolor Brown; + for k=2 upto indiceChemin-1: + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + else: + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + fi; + trace TraceLabyrinthe; + ); + CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace CorpsSolution; + \end{mplibcode} +}%
\ No newline at end of file |