2011-10-22 2 views
4

J'ai un tableau 2D et je veux le convertir en tableau 1D.Opération voisine la plus proche sur des éléments de tableau 1D

Le tableau 2D est:

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

à tableau 1D:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

Comment puis-je accéder voisin le plus proche du nombre d'éléments dans le tableau 1D, afin que je puisse obtenir le même résultat lorsque j'accède dans un tableau 2D, tel que

1 2 3 
5 6 7 
9 10 11 

en C++ ?

+1

Avec l'arithmétique. Ancienne indexation 'm [1] [2]' nouvelle indexation 'm [1 * 4 + 2]'. Ancien voisin le plus proche '[x-1] [y-1], [x] [y-1], x [x + 1] [y]' etc., nouveau: '[(x-1) + 4 * (y-1)], [x + 4 * (y-1)], [x + 1 + 4 * (y-1)] '. Remplacer '4' pour la largeur de votre tableau. – user786653

+0

Merci, cela fonctionne. – taker

+0

La logique, si cela ne vous dérange pas de lire le code python, peut être trouvé [ici] (http://stackoverflow.com/a/41880018/5496529) –

Répondre

3

Si vous avez un tableau 2D qui est M articles long par N articles de hauteur, vous avez besoin d'un tableau 1D qui a M*N éléments.

Lorsque vous essayez de trouver les voisins de l'élément x:

left(x) = (x - 1) % M 
right(x) = (x + 1) % M 
above(x) = (x - M) % (M * N) 
below(x) = (x + M) % (M * N) 

Notez que la solution ci-dessus rend le bas et le haut de votre tableau adjacent, ainsi que le bord droit et côté gauche. Pour se débarrasser de cela, il suffit d'omettre le calcul modulaire et de détecter quand votre index a dépassé les bords droit/gauche/haut/bas.

+0

Je suis désolé mais je ne comprends pas votre solution. M'éclairerais-tu? – taker

+0

Si vous regardez l'emplacement du tableau 'x', alors le voisin de gauche est' x-1'. Le voisin à droite est à "x + 1". Le voisin au-dessus de vous est à 'x-M'. Le voisin en dessous de vous est 'x + M'. Cela suppose que votre axe vertical augmente au fur et à mesure que vous descendez. Si vous voulez qu'il diminue, alors permutez le calcul pour ci-dessus et ci-dessous. Le re est un cas de bordure littérale - comment voulez-vous gérer les voisins lorsque vous atteignez le bord supérieur, inférieur, gauche ou droit? – ObscureRobot

Questions connexes