2

ユーザーから指定された次元 N と M のテーブルがあります。このテーブルは 0 と 1 だけで埋められます。だから私はこのようなものを得る:

0 0 0 1 0
1 1 0 0 0
0 0 0 0 1
0 0 0 0 0
0 1 1 0 0

私の質問は、1 つの 1 を囲む 1 の数をどのように数えますか?

私はこのように始めました:

int nb_neighbours_M(int **tab, int i, int j, int n, int m)
{

  int nb_neighbours = 0;`

  for (i = 0; i < n; i++)
  {
    for (j = 0; j < m; j++)
    {

    }
  }
}
4

2 に答える 2

2

これを行う最も簡単な方法は、セルの隣接セルごとに座標の変化を格納するint drow[NUMBER_OF_DIRECTIONS]との2 つの配列を用意することです。int dcol[NUMBER_OF_DIRECTIONS]

// North, East, South, West
int drow[NUMBER_OF_DIRECTIONS] = {-1,  0, 1, 0};
int dcol[NUMBER_OF_DIRECTIONS] = {0, 1, 0, -1};

int row, col; // the coordinates of the cell you want to check the neighbours of
int num_neighbours = 0;

for (int i = 0; i < NUMBER_OF_DIRECTIONS; i++) {
        if (tab[row + drow[i]][col + dcol[i]] == 1) {
            num_neighbours++;
        }
}

上記の例では、4 方向のみを処理しますが、実際のコードを変更することなく、このスニペットを簡単に適応させて 8 方向を処理することができます (これは良いことです™)。

何もしないので、おそらくこれに境界チェックも追加する必要があります。

于 2013-01-26T11:47:21.330 に答える
2

ループを展開すると、そのようなことができます。

int count_neighbours (int **a, int x, int y, int w, int h)
{
  int res = 0;

  int left   = x <= 0;
  int right  = x >= w - 1;
  int top    = y <= 0;
  int bottom = y >= h - 1; 

  if (!left && !top)     res += a[x-1][y-1];
  if (!right && !bottom) res += a[x+1][y+1];
  if (!left && !bottom)  res += a[x-1][y+1];
  if (!right && !top)    res += a[x+1][y-1];
  if (!left)             res += a[x-1][y];
  if (!right)            res += a[x+1][y];
  if (!top)              res += a[x][y-1];
  if (!bottom)           res += a[x][y+1];

  return res;
}
于 2013-01-26T11:47:48.980 に答える