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.
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)
En entrée lb et cb sont les coordonnées de l'endroit où je souhaite amener mon 0
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 :
     3    10     5     6
     8     1     4     2
    11     0    13    14
    10     9     7    15
Le déplacement de (3,2) à (3,1) donne :
     3    10     5     6
    11     8     4     2
     0     1    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 !

Quelqu'un aurait-il une idée de la raison de ces "détours" ?
Merci (INFINIMENT) d'avance à tous !


Peter