2009-12-27 8 views
1

Fondamentalement, je crée un puzzle 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.Comparer 2 éléments d'une matrice 3x3 pour voir si l'élément 2 est adjacent à l'élément 1

Depuis le casse-tête est seulement 9 pièces (3x3), je suis actuellement en utilisant 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 faire programatically? Quelqu'un sait-il d'un tel algorithme?

Toute aide est appréciée.

+0

S'il vous plaît décrire la séquence de contrôle, parce que nous ne savons pas les règles du jeu. – Drakosha

+0

Vous pouvez facilement voir cela en étudiant mon code actuel. C'est un peu difficile à expliquer, – google

+0

On dirait un programme pour moi. –

Répondre

1

En supposant que votre matrice a des positions comme ceci:

1 2 3 
4 5 6 
7 8 9 

Vous devriez pouvoir effectuer les opérations suivantes:

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

C'est exactement comme cela que ma matrice est, et cela ne fonctionne pas correctement. Exemple: let p1 = 4 et p2 = 3 Il ne doit pas correspondre comme p2 est dans le coin supérieur droit (p1 est au milieu à gauche), mais il passe le cas test. – google

+0

Modifier, NVM juste remarqué votre modification. Je vais essayer. – google

+0

Non, cela échoue sur p1 = 2, p2 = 5 quand il devrait correspondre, Échoue également sur: p1 = 5, p2 = 8 – google

0

Vous pouvez également convertir chaque morceau sur la grille en forme de coordonnées.

ie:

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

Ainsi, étant donné que les coordonnées de p1 est (x_p1, y_p1) et p2 est (x_p2, y_p2) alors votre fonction retournerait vrai si:

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

Je pense ...? Je n'ai pas vraiment essayé.

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

0

En supposant que cela est 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);