Un ami avait besoin d'un algorithme qui lui permettrait de parcourir les éléments d'une matrice NxM (N et M sont impairs). J'ai proposé une solution, mais je voulais voir si mes collègues de SO pouvaient proposer une meilleure solution.
Je poste ma solution en tant que réponse à cette question.
Résultat exemple:
Pour une matrice 3x3, le résultat devrait être:
(0, 0) (1, 0) (1, 1) (0, 1) (-1, 1) (-1, 0) (-1, -1) (0, -1) (1, -1)
De plus, l'algorithme devrait prendre en charge les matrices non carrées, donc par exemple pour une matrice 5x3, le résultat devrait être:
(0, 0) (1, 0) (1, 1) (0, 1) (-1, 1) (-1, 0) (-1, -1) (0, -1) (1, -1) (2, -1) (2, 0) (2, 1) (-2, 1) (-2, 0) (-2, -1)
0 votes
Pouvez-vous expliquer ce que vous voulez pour les matrices non carrées ? Votre solution a un "saut" de (2, 1) à (-2, 1) -- est-ce voulu ? [Par exemple, pour une matrice 7x3, elle aurait deux "sauts" supplémentaires, et pour une matrice (2k+1)x3, elle aurait 2k-3 sauts ?]
3 votes
Oui, les sauts sont intentionnels. J'ai mis à jour la question avec une image de matrice 5x3. Comme vous pouvez le voir sur l'image, nous sautons les lignes du haut et du bas.
0 votes
D'accord, alors votre propre code semble le plus propre. Et bien que cela soit hors sujet : comment avez-vous généré ces images? :)
0 votes
\=)) Je ne les ai pas générés. En fait, la façon dont je les ai créés est assez stupide. J'ai créé les tableaux dans OO.org Calc, j'ai pris une capture d'écran, et j'ai édité la capture d'écran dans GIMP. =))
0 votes
Pourquoi voudriez-vous faire cela? Itérer à travers les lignes/colonnes a un comportement de cache beaucoup mieux...la localité des données!
1 votes
@Ying: Je ne sais pas vraiment pourquoi mon ami a besoin de cela, mais il a dit qu'il veut favoriser les membres de la matrice plus proches du centre dans un algorithme de recherche.
0 votes
@Ying, il pourrait arrêter la recherche dès qu'il trouve quelque chose. Peut-être pour un jeu.
0 votes
J'ai supprimé la balise code-golf. Il ne semble pas s'agir de code golf.
0 votes
FYI, vous pouvez calculer la position pour une seule cellule sans boucles: stackoverflow.com/questions/9135823/…