/ / Comparaison de 2 éléments d’une matrice 3x3 pour voir si l’élément 2 est adjacent à l’élément 1 - algorithme, validation, matrice, sélection

Comparer 2 éléments d'une matrice 3x3 pour voir si l'élément 2 est adjacent à l'élément 1 - algorithme, validation, matrice, sélection

Fondamentalement, je crée un casse-tête où vous pouvez échanger des pièces. Et je veux m'assurer que lors de l'échange de 2 éléments, la sélection est valide.

Comme le puzzle n’est que de 9 pièces (3x3), j’utilise actuellement le code:

  function valid_selection(p1, p2) {
if (p1 == 1 && (p2 == 2 || p2 == 4)) return true;
if (p1 == 2 && (p2 == 1 || p2 == 3 || p2 == 5)) return true;
if (p1 == 3 && (p2 == 2 || p2 == 6)) return true;
if (p1 == 4 && (p2 == 1 || p2 == 5 || p2 == 7)) return true;
if (p1 == 5 && (p2 == 2 || p2 == 4 || p2 == 6 || p2 == 8)) return true;
if (p1 == 6 && (p2 == 3 || p2 == 5 || p2 == 9)) return true;
if (p1 == 7 && (p2 == 4 || p2 == 8)) return true;
if (p1 == 8 && (p2 == 5 || p2 == 7 || p2 == 9)) return true;
if (p1 == 9 && (p2 == 6 || p2 == 8)) return true;

return false;
}

Mais puis-je le faire par programmation? Quelqu'un sait d'un tel algorithme?

Toute aide est appréciée.

Réponses:

1 pour la réponse № 1

En supposant que votre matrice a des positions telles que:

1 2 3
4 5 6
7 8 9

Vous devriez pouvoir faire ce qui suit:

if ( abs(p2-p1) == 3 // test for vertical connectedness
|| ( abs(p2-p1) == 1 // test for horizontal connectedness
&& ( p1+p2 != 7 && p1+p2 != 13) ) ) // except for edge cases (3,4 and 6,7)
return true;

0 pour la réponse № 2

Vous pouvez également convertir chaque pièce de la grille en coordonnées.

c'est à dire:

1 est (0,0), 2 est (0,1), 3 est (0,2), 4 est (1,0), etc

Donc, étant donné que la coordonnée de p1 est (x_p1, y_p1) et que p2 est (x_p2, y_p2), votre fonction renverra true si:

(abs (x_p2 - x_p1) + abs (y_p2 - y_p1)) == 1

Je pense...? Haven "t réellement essayé.

Et cela devrait fonctionner quelle que soit la taille de la grille.


0 pour la réponse № 3

En supposant qu'il s'agisse de JavaScript:

var N = 3;  // size of matrix

var x1 = p1 % N, y1 = Math.floor(p1 / N);
var x2 = p2 % N, y2 = Math.floor(p2 / N);

return (x1 == x2 && Math.abs(y2 - y1) == 1) ||
(y1 == y2 && Math.abs(x2 - x1) == 1);