Bonjour à tous,
Alors voilà, je viens consulter les Dieux de MATLAB ( ) Parce que j'ai un sale problème ! Un problème du genre qui rend dingue parce que terriblement simple, et terriblement obscur à la fois.. JE SAIS QUE VOUS VOYEZ DE QUOI JE PARLE !
DONC, laissez-moi vous expliquer ce problème qui est le mien :
Je suis censé réaliser un programme capable de résoudre n'importe quel Taquin sous forme matricielle (un taquin, c'est ça : http://fr.wikipedia.org/wiki/Taquin ). Bref, je commence par le commencement en confectionnant un sous-programme permettant de déplacer le vide (matérialisé par "0" dans la matrice du Taquin) de manière verticale et horizontale, voir les 2 à la fois si besoin.
En entrée lb et cb sont les coordonnées de l'endroit où je souhaite amener mon 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 function Z=bouge(M,lb,cb); %FONCTION : Remplacer la case de coordonnées (ligne lb,colonne cb) par le 0, en décalant de manière réaliste les autres éléments. [l0,c0]=find(M==0); %Cherche l'élément 0 dans la matrice M %2 cas sont possibles : "Le zéro est à droite" ou "le zéro est à gauche" if c0>cb %Zero à droite while c0~=cb; c=M(l0,c0-1); M(l0,c0-1)=M(l0,c0); M(l0,c0)=c; [l0,c0]=find(M==0); end elseif c0<cb %Zero à gauche while c0~=cb; c=M(l0,c0+1); M(l0,c0+1)=M(l0,c0); M(l0,c0)=c; [l0,c0]=find(M==0); end end %2 cas sont possibles : "Le zéro est au dessus" ou "le zéro est en dessous" if l0>lb %Zero au dessus while l0~=lb; l=M(l0-1,c0); M(l0-1,c0)=M(l0,c0); M(l0,c0)=l; [l0,c0]=find(M==0); end elseif l0<lb %Zero en dessous while l0~=lb; l=M(l0+1,c0); M(l0+1,c0)=M(l0,c0); M(l0,c0)=l; [l0,c0]=find(M==0); end end disp(M)
Et c'est là que ça foire (!!!) : Quand je lui demande un déplacement de gauche à droite (ou inversement) simple, il prend des chemins étranges au lieu de simplement faire passer le 0 de case en case sur la même ligne.. (j'espère que je suis assez clair) Et ça, ça m'embête beaucoup, parce que chaque déplacement devra être expliqué par le programme final : les détours sont parasites.
Exemple de détour :
Le déplacement de (3,2) à (3,1) donne :3 10 5 6 8 1 4 2 11 0 13 14 10 9 7 15
On voit bien que les 0 est passé par la 2e ligne puis s'est décalé à gauche pour redescendre ensuite.. STUPIDE !3 10 5 6 11 8 4 2 0 1 13 14 10 9 7 15
Quelqu'un aurait-il une idée de la raison de ces "détours" ?
Merci (INFINIMENT) d'avance à tous !
Peter
Partager