2014-11-21 1 views
2

Если у меня есть массив 2D int, называемый myArray, который, например, имеет размер 3x3, и его элементы могут иметь только 1 или 0 для значения, что было бы эффективным способом рассчитать, сколько из них существует вокруг определенного элемента? Например:Эффективный способ поиска количества соседних элементов с определенным значением вокруг определенного элемента в массиве

[0][0][0] 
[0][1][0] 
[1][1][1] 

Элемент туАггау [0] [0] будет иметь neighbourCount от 1, а туАггау [0] [1] будет иметь neighbourCount из 3.

Это мой текущий код грубой силы. туАггау = currentGeneration

public int neighbours(int x, int y) { //x and y are 0 index based coordinates, they are swapped inside to corespond with actual x and y coordinates 
     int neighbourCounter = 0; 
     if(x == 0 && y == 0) { 
      if(currentGeneration[y+1][x] == 1) { 
       neighbourCounter++; 
      } 
      if(currentGeneration[y][x+1] == 1) { 
       neighbourCounter++; 
      } 
      if(currentGeneration[y+1][x+1] == 1) { 
       neighbourCounter++; 
      } 
     } else if(x == 0 && y == currentGeneration.length - 1) { 
          if(currentGeneration[y-1][x] == 1) { 
            neighbourCounter++; 
          } 
          if(currentGeneration[y][x+1] == 1) { 
            neighbourCounter++; 
          } 
          if(currentGeneration[y-1][x+1] == 1) { 
            neighbourCounter++; 
          } 
     } else if(x == currentGeneration[0].length - 1 && y == currentGeneration.length - 1) { 
          if(currentGeneration[y-1][x] == 1) { 
            neighbourCounter++; 
          } 
          if(currentGeneration[y][x-1] == 1) { 
            neighbourCounter++; 
          } 
          if(currentGeneration[y-1][x-1] == 1) { 
            neighbourCounter++; 
          } 
     } else if(y == 0 && x == currentGeneration[0].length - 1) { 
          if(currentGeneration[y][x-1] == 1) { 
            neighbourCounter++; 
          } 
          if(currentGeneration[y+1][x] == 1) { 
            neighbourCounter++; 
          } 
          if(currentGeneration[y+1][x-1] == 1) { 
            neighbourCounter++; 
          } 
     } else if(y == 0) { 
      for(int i = -1; i <= 1; i+=2) { 
       if(currentGeneration[y][x+i] == 1) { 
        neighbourCounter++; 
       } 
      } 
      if(currentGeneration[y+1][x] == 1) { 
       neighbourCounter++; 
      } 
      for(int i = -1; i <= 1; i+=2) { 
       if(currentGeneration[y+1][x+i] == 1) { 
        neighbourCounter++; 
       } 
      } 
     } else if(x == 0) { 
      for(int i = -1; i <= 1; i+=2) { 
       if(currentGeneration[y+i][x] == 1) { 
        neighbourCounter++; 
       } 
      } 
      if(currentGeneration[y][x+1] == 1) { 
       neighbourCounter++; 
      } 
      for(int i = -1; i <= 1; i+=2) { 
       if(currentGeneration[y+i][x+1] == 1) { 
        neighbourCounter++; 
       } 
      } 
     } else if(y == currentGeneration.length - 1) { 
      for(int i = -1; i <= 1; i+=2) { 
       if(currentGeneration[y][x+i] == 1) { 
        neighbourCounter++; 
       } 
      } 
      if(currentGeneration[y-1][x] == 1) { 
       neighbourCounter++; 
      } 
      for(int i = -1; i <= 1; i+=2) { 
       if(currentGeneration[y-1][x+i] == 1) { 
        neighbourCounter++; 
       } 
      } 
     } else if(x == currentGeneration[0].length - 1) { 
      for(int i = -1; i <= 2; i+=2) { 
       if(currentGeneration[y+i][x] == 1) { 
        neighbourCounter++; 
       } 
      } 
      if(currentGeneration[y][x-1] == 1) { 
       neighbourCounter++; 
      } 
      for(int i = -1; i <= 2; i+=2) { 
       if(currentGeneration[y+i][x-1] == 1) { 
        neighbourCounter++; 
       } 
      } 
     } else { 
      for(int i = -1; i <= 1; i+=2) { 
       if(currentGeneration[y+i][x] == 1) { 
        neighbourCounter++; 
       } 
       if(currentGeneration[y][x+i] == 1) { 
        neighbourCounter++; 
       } 
       if(currentGeneration[y+i][x+i] == 1) { 
        neighbourCounter++; 
       } 
       if(currentGeneration[y+i][x-i] == 1) { 
        neighbourCounter++; 
       } 
      } 
     } 
     return neighbourCounter; 
    } 
+1

Я предполагаю, что это домашнее задание ?? –

+0

Что вы пробовали до сих пор. Если вы разместите какой-либо код, мы можем рассказать вам, правильно ли вы это сделали или если есть лучший способ. – Maxqueue

+1

Нет, мне просто интересно, будет ли эффективный метод для этого. Мой текущий метод включает в себя довольно много грубых, заставляя его проверять, где находится конкретный «центральный» элемент (один из углов, один из краев или средний), а затем проверка возможных соседей, не выходя из границ массива. – echoeida

ответ

0

Как об этом:

public static int findNeighbors(int x, int y, int[][] a) { 
    int sum = 0; 
    for (int i = (y>0 ? y-1 : 0); i <= (y<a.length-1 ? y+1 : a.length-1); ++i) 
     for (int j = (x>0 ? x-1 : 0); j <= (x<a[0].length-1 ? x+1 : a[0].length-1); ++j) 
      sum += a[i][j]; 
    sum -= a[y][x]; 
    return sum; 
} 
+0

Обратите внимание на редактирование в 6-й строке: 'sum - = a [y] [x];' вместо 'sum - = a [x] [y];' обвинить порядок декартовых координат, отличающийся от порядка индексы массива :) –

Смежные вопросы