Encontrar elementos dentro de la distancia k de una matriz.

Dada una matriz * n y un valor k, ¿cómo encontramos todos los vecinos para cada elemento? por ejemplo: en una matriz de 4*4 , con k=2 matriz es:

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

donde estos valores son los índices de la ubicación, los vecinos para 1 are 1,2,3,5,6,9 . Los valores 3,6 and 9 vienen solo porque k = 2 y no estarían allí si k fuera = 1.

Del mismo modo, los vecinos de 6 serán 1 2 3 5 6 7 8 9 10 11 and 14

¿Me pueden ayudar, por favor, a escribir código de CA para implementar esto en c ++?

Es el problema del vecindario de von Neumann, por favor, alguien puede implementarlo en c ++. Gracias

Esto debería hacer el truco para k = 1. Haz pequeños cambios para que funcione para todos los k.

 int width = 4; int height = 4; int k = 1; int value = 2; bool hasRight = (value % width != 0); bool hasLeft = (value % width != 1); bool hasTop = (value > 4); bool hasBottom = (value < (height * width - width)); cout << value; // Always itself if(hasRight == true) { cout << value+1 << " "; // Right if(hasTop == true) { cout << value-width << " " << value-width+1 << " "; // Top and Top-right } if(hasBottom == true) { cout << value+width << " " << value+width+1; // Bottom and Bottom-right } } if(hasLeft == true) { cout << value-1 << " "; // Left if(hasTop == true) { cout << value-width-1 << " "; // Top-left } if(hasBottom == true) { cout << value+width-1 << " "; // Bottom-left } } 

Tus vecinos formarán un patrón de diamante alrededor de tu elemento objective. Los puntos del diamante estarán a k saltos del elemento objective. Entonces, la parte superior será k filas hacia arriba, la izquierda será k columnas sobre, etc. El diamante se expande uniformemente a medida que avanza de nivel en nivel. Si comienza en el punto superior y baja una fila (más cerca del nodo objective), salga 1 a cada lado. Es simétrico en las otras direcciones. En otras palabras, la diferencia en las coordenadas x entre un vecino y el nodo objective más la diferencia en y será <= k.

Así que solo haga dos nesteds para los bucles que se repiten sobre este diamante. El bucle externo itera sobre las filas, el bucle interno sobre las columnas. Comience en la parte superior, luego expanda el diamante en 1 en cada iteración de bucle exterior hasta que llegue a la misma fila que el elemento objective, luego contráigase hasta llegar al punto inferior. Obviamente, necesitarás probar las condiciones de contorno para salir de la matriz.