1 pièce(s) jointe(s)
Lire une matrice carrée en zig-zag
bonjour,
j'ai passée toute une journée a ecrire un algorithme pour une matrice en zig-zag mais aucun resultat
svp qu'elqu'un peut me proposer comment procède pour que je démarre
Pièce jointe 210875
Lire une matrice carrée en zig-zag
Bonjour, :D Je me suis gouré cette nuit en oubliant de codifier ce qui se passe à partir de la seconde diagonale, donc pour (x + y) >= xmax) ... je rectifie, donc.
Ne serait-il pas plus simple de considérer que 4 sortes de déplacements interviennent, et se succèdent d'une manière cyclique, le changement étant déclenché par les valeurs extrêmes des indices (x ou y = 0 ou Lim) ?
D1 = déplacement horizontal vers la droite: _ _ _ _ _ (x = x + 1)
D2 = descente en diagonale vers la gauche:_ _ _ _ _ (x = x - 1) et (y = y + 1)
D3 = déplacement vertical vers le bas:_ _ _ _ _ _ _ _(y = y + 1)
D4 = montée en diagonale vers la droite: _ _ _ _ _ _ (x = x + 1) et (y = y - 1)
On observe d'abord les transitions suivantes, de périodicité égale à 4:
D1 ──────────> D2 ──────────> D3 ──────────> D4 ──────────> D1 ... { pour (x + y) < Lim , en posant Lim = xmax = ymax )
--- (Si y=0) -------- (Si x=0) --------- (Si x=0) -------- (Si y=0)
le cycle s'inversant au-delà de la seconde diagonale:
D4 ──────────> D3 ──────────> D2 ──────────> D1 ──────────> D4 ... { pour (x + y) >= Lim )
--- (Si x=Lim)------ (Si x=Lim) ------ (Si y=Lim)------- (Si y=Lim)
Le nouveau déplacement serait commandé par un indice d'état vérifiant la relation de récurrence: Ik+1 = F(Ik) , avec:
si (x + y)<Lim alors si (n < 4) alors F(n) = n + 1
- - - - - - - - - - - - - - - - -sinon F(n) = 1
- - - - - - - -sinon si (n > 1) alors F(n) = n - 1
- - - - - - - - - - - - - - - - -sinon F(n) = 4
2 pièce(s) jointe(s)
Lire une matrice carrée en zig-zag
Bonjour, :D
Ça marche, mais j'ai perdu beaucoup de temps :ptdr: avant de m'apercevoir que l'inversion des cycles devait intervenir au milieu de la seconde diagonale, et non vers l'une de ses extrémités. La condition évoquée dans le précédent message, et ne concernant que la somme des indices (Sxy = x + y) dans une matrice carrée d'ordre (Lim + 1):
Code:
1 2 3 4 5
| TYPE Mat_B = ARRAY[0..Lim, 0..Lim] OF Byte;
...
Test: Boolean;
...
Test:= (Sxy<Lim) |
plante l'exécution du programme au niveau de la 2nde diagonale et doit être remplacée par une expression plus complexe:
Code:
1 2 3 4 5
| Lim2 = Lim * (Lim + 2); // Lim2 = (Lim + 1)^2 - 1
...
m:= 2 * Z1;
...
Test:= (Sxy<Lim) OR ((Sxy=Lim) AND (m<Lim2)) |
mettant en jeu le rang (z, localement Z1) de la case abordée, et sa valeur maximale (Zmax = Lim2).
De simples considérations de symétrie auraient dû me permettre de localiser plus rapidement l'erreur.
Voici le tableau obtenu dans le cas d'une matrice 12x12 :
Pièce jointe 211095
@picodev: Même en éliminant les instructions relatives aux couleurs, mon code est nettement moins compact que le tien; quand à déchiffrer ce dernier, c'est pour moi une autre paire de manches ...
C'est cependant un exercice intéressant.
@anapurna: Lier le sens de parcours des diagonales à la parité de la somme (x +y) m'a paru une bonne idée de départ; mais le temps perdu sur la correction de mon propre programme ne m'a pas permis de la tester. Comme l'expérience vient encore de le montrer, il y a parfois loin entre un projet apparemment simple et l'obtention d'un programme viable.
# Je viens de joindre le code source, pour ceux que cela pourrait intéresser. C'est un fichier de Virtual Pascal, probablement compilable en Turbo et Free P. La clarté du langage, quasiment assimilable à du pseudo-code, en facilite la traduction.
Lire une matrice carrée en zig-zag
Bonjour,
Merci pour l'info; la formule est impressionnante, mais laisse deviner certaines propriétés de la matrice et de la transformation:
# les termes en (-1)i+j sont liés à l'inversion spécifique des rangées de longueur impaire, comme l'avait déjà remarqué un intervenant;
# l'existence d'une relation complémentaire ZZ(n, i, j) = N2 -1 - ZZ(n, n - 1 - i, n - 1 - j) provient de ce que les valeurs des cases successives (c.a.d. leur rang) forment une suite arithmétique;
# les indices ne peuvent être égaux à l'ordre (n), et l'indexation s'étend donc de (0) à (n - 1), et celle des cases de ZZ(n, 0, 0) = 0 à ZZ(n, n - 1, n - 1) = n2 - 1 .
Ça tombe bien, parce que j'avais justement pris ces conventions dans le programme précédent. :mrgreen: Point de vue égoïste, je le reconnais.
Pourrais-tu m'indiquer d'où tu tiens ce résultat (livre ou site web) ? A moins évidemment que tu ne l'aies établi toi-même ...
Je me suis comme les autres efforcé de trouver un algorithme "nomade" décrivant le parcours effectué d'une case à l'autre; et c'était bien là, il me semble, l'esprit de la question posée (quoique très brièvement exprimée).
Mais un autre procédé plus rapide pourrait être envisagé, en deux étapes:
a) remplissage de la matrice par les entiers naturels successifs de [0 ; n2-1] à partir du coin supérieur gauche (a0,0), en suivant dans le sens toujours descendant les rangées consécutives parallèles à la seconde diagonale;
b) transposition des mêmes rangées d'ordre impair > 2 (pour les coins extrêmes, c'est inutile).
Cette dernière transformation est involutive, puisque son renouvellement conduit à la matrice d'origine. Ce procédé constitue cependant une tricherie, dans la mesure où l'obtention de la matrice transformée ne passe plus par le parcours imposé. A voir cependant ...
Un recherche sur le web, un peu décevante (très peu de références en français) montre cependant qu'il ne s'agit pas d'un simple sujet d'école; beaucoup d'articles concernent le traitement des images; encore faut-il choisir les bon termes:
# Zig-zag ordering: _ _ _ _ _ _ _ _ _ _ _ _ http://www.pcs-ip.eu/index.php/main/edu/7
# Zig-Zag Scanning Patterns: _ _ _ _ _ _ _ http://www.bretl.com/mpeghtml/zigzag.HTM
# Zig-Zag scan _ _ _ _ _ _ _ _ _ _ _ _ _ _ http://www.mathworks.com/matlabcentr...ntent/zigzag.m
# Séquence zig-zag: _ _ _ _ _ _ _ _ _ _ _ _http://home.nordnet.fr/~jpbaey/tipe/compression_jpeg/codage_de_la_matrice_dct_quantif.htm
# run-length encoding (RLE) algorithm _ _ _ https://en.wikipedia.org/wiki/JPEG
Le résultat le plus surprenant concerne le site rosetta.org
# Zig-zag matrix _ _ _ _ _ _ _ _ _ _ _ _ _ _ https://rosettacode.org/wiki/Zig-zag_matrix
sur lequel on l'algorithme en question proposé en 83 langages!
https://rosettacode.org/wiki/Zig-zag_matrix#Pascal
https://rosettacode.org/wiki/Zig-zag_matrix#C
On y trouve d'ailleurs bien d'autres programmes, proposé en plusieurs centaines de langages (394 en Pascal, et 775 en C) ... de quoi s'occuper jusqu'en maison de retraite, et même après ... :aie:
https://rosettacode.org/wiki/Categor...ming_Languages
https://rosettacode.org/wiki/Category:Pascal (là, c'est un bug du traitement de texte)
https://rosettacode.org/wiki/Category:C
Sur un sujet apparenté (simplement aperçu):
Spiral matrix https://rosettacode.org/wiki/Spiral_matrix
Mais peut-être que beaucoup de programmeurs connaissent déjà ces liens.
1 pièce(s) jointe(s)
Lire une matrice carrée en zig-zag
Bonjour :D
Je viens de trouver un version plus simple pour l'algorithme de parcours de la matrice; il suffit de suivre les rangées successives parallèles à la seconde diagonale, le sens de parcours dépendant de la parité de la somme des indices (s = i + j) .
Ceux-ci appartiennent au domaine [0 ; Lim], et les bornes du balayage sont évidentes.
Code:
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
|
CONST Lim = 19; Lim2 = 2 * Lim;
TYPE Mat_B = ARRAY[0..Lim, 0..Lim] OF Word;
...
Entete; m:= 0;
FOR Sxy:= 0 TO Lim DO
IF Odd(Sxy) THEN FOR i:= 0 TO Sxy DO BEGIN
Inc(m); j:= Sxy - i;
Mat[i, j]:= m
END
ELSE FOR j:= 0 TO Sxy DO BEGIN
IF Sxy>0 THEN Inc(m);
i:= Sxy - j;
Mat[i, j]:= m
END;
FOR Sxy:= (Lim+1) TO Lim2 DO
IF Odd(Sxy) THEN FOR i:= (Sxy - Lim) TO Lim DO BEGIN
Inc(m); j:= Sxy - i;
Mat[i, j]:= m
END
ELSE FOR j:= (Sxy - Lim) TO Lim DO BEGIN
Inc(m); i:= Sxy - j;
Mat[i, j]:= m
END;
AffM; O |
Pièce jointe 211230
Lire une matrice carrée en zig-zag
Citation:
Envoyé par
Flodelarab
... C'est ce que j'ai dit dès mon premier message ...
A ceci près qu'interviennent deux dichotomies: Sxy < ou > Lim(diagonale) et (Sxy MOD 2) = 0 ou 1
qui conduisent à 4 sortes de doubles boucles imbriquées.
Citation:
... pour lequel j'ai reçu un joli pouce baissé ...
Ce n'est pas moi, juré; je le réserve aux trolls - au fait, a-t-on des nouvelles de FleurEnPlastique ?
Citation:
... Toutes vos solutions ont des conditions. Alors qu'aucune condition n'est nécessaire ...
Là, je veux bien connaître ton programme, et le voir fonctionner ...
Moi, je pense avoir une solution de ce genre: l'algorithme char d'assaut utilisant la formule établie par Picodev (voir l'un des messages précédents). Je songe d'ailleurs à l'écrire, pour vérification.
Nous en sommes déjà à 3 programmes mis au point, plus 2 autres (écrite de même en Pascal et en C) disponibles sur rosetta.org - sans compter les 81 autres versions présentes sur le même site ... Il va falloir bientôt créer une section "Matrices Zig-zag".
Au moins l'auteur du sujet (emna1987) ne pourra pas se plaindre que sa demande soit restée sans réponse ! :mrgreen: