2016-03-25 13 views
-1

Ich habe Probleme herauszufinden, wie die 1 in dem Array in meinem Code unten unter Berücksichtigung der Ecken & Kanten des Arrays identifiziert zu identifizieren.Nachbarn in einem Array

#include <stdio.h> 
/* define grid size */ 
#define SIZE 7 
int grid[SIZE][SIZE]; 
/* function to find the number of occupied adjacent cells */ 
int neighbors (int i, int j); 
void main() 
{ 
    int i, j, n; 
/* initialize the entire grid to be zero */ 
for (i = 0; i < SIZE; i++) 
    for (j = 0; j < SIZE; j++) 
     grid[i][j] = 0; 
/* introduce a few ones */ 
    grid[1][2] = 1; 
    grid[2][2] = 1; 
    grid[1][4] = 1; 
    grid[2][4] = 1; 
    grid[3][2] = 1; 
    grid[3][3] = 1; 
    grid[3][4] = 1; 
    grid[5][3] = 1; 
    grid[6][2] = 1; 
for (i = 0; i < SIZE; i++) 
    for (j = 0; j < SIZE; j++) { 
     n = neighbors(i,j); 
     printf ("Number of neighbors to element %d,%d =%d\n",i,j,n); 
} 
return; 
} 
/* function to compute the neighbors */ 
int neighbors (int i, int j) 

Ich vermute, dass ich verwenden können, wenn Aussagen zu ändern, wie der Code wird ausgeführt, wenn i = 0 oder i = 6, und auch, wenn j = 0 oder j = 6, aber ich bin nicht sicher, wie fortfahren. Jede Hilfe würde sehr geschätzt werden

+1

Bitte einrücken Ihren Code in Ihrer Frage. – jdarthenay

+0

Auch 7 ist bereits außerhalb der Grenzen Ihrer Matrix, ich denke im letzten Satz meinen Sie "i == 1 oder i == 6, sowie wenn j == 1 oder j == 6" – jdarthenay

+0

@jdarthenay Sie sind korrekt, die entsprechenden Änderungen wurden vorgenommen –

Antwort

0

Es ist möglich, den direkten Zugriff auf das Array in einer Abstraktionsschicht zu wickeln. Diese Ebene kann die Zugriffslogik und zusätzliche Prüfungen verbergen. Etwas wie:

int get_grid(int i, int j) 
{ 
    if (i>=0 && i<SIZE) 
     return grid[i][j]; 
    return 0; 
} 

Und die aufrufende Funktion:

int neighbors (int i, int j) 
{ 
    return get_grid(i-1, j-1) + get_grind(i-1, j) + ... 
} 
0

Ich schlage vor:

int neighbors (int i0, int j0) 
{ 
    int imax = (i0 < SIZE) ? (i0 + 1) : SIZE; 
    int jmax = (j0 < SIZE) ? (j0 + 1) : SIZE; 
    int result = 0; 

    for (int i = (i0 > 0) ? (i0 - 1) : 0; i <= imax; i++) 
    { 
     for (int j = (j0 > 0) ? (j0 - 1) : 0; j <= jmax; j++) 
     { 
      if ((i != i0 || j != j0) && grid[i][j] != 0) 
      { 
       result++; 
      } 
     } 
    } 

    return result; 
} 
+0

Was ist der C99-Modus? Ich habe das noch nicht gelernt und bin unsicher, wie man kompiliert, um den Code zu testen –

+0

@Christian Littner Ich frage mich, warum Sie dies als Kommentar zu meiner Antwort fragen. C99 ist ein neuerer Standard, der es mit der Option "-std = C99" ermöglicht, einige Codes zu aktivieren, die von älteren Standards nicht aktiviert wurden. – jdarthenay

Verwandte Themen