Если у меня есть массив 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;
}
Я предполагаю, что это домашнее задание ?? –
Что вы пробовали до сих пор. Если вы разместите какой-либо код, мы можем рассказать вам, правильно ли вы это сделали или если есть лучший способ. – Maxqueue
Нет, мне просто интересно, будет ли эффективный метод для этого. Мой текущий метод включает в себя довольно много грубых, заставляя его проверять, где находится конкретный «центральный» элемент (один из углов, один из краев или средний), а затем проверка возможных соседей, не выходя из границ массива. – echoeida