2017-02-15 10 views
-1

У меня есть 2D массив в Java (например)Как лечить противоположные края массива Java, как если бы они смежны

0|0|0|0 
1|1|1|0 
0|1|0|1 

Мне нужно создать код, который говорит, что если элементы вокруг площади являются что-то, что-то делать. Я могу это сделать, но у меня есть проблема.

Если элемент находится на грани, массив должен эффективно обернуть, чтобы верхняя строка находилась рядом с нижней строкой.

Кто-нибудь знает, как это сделать?

+0

Не понятно, почему это нужно обернуть. И что именно «делают что-то» точно. – RealSkeptic

+0

Вы, кажется, противоречите себе, вы говорите, что можете найти предметы вокруг площади, но затем заявить, что вы не можете найти предметы на краю? как найти что-то вокруг площади и найти элемент на краю другого? –

+1

Подождите ... вы спрашиваете, как вы обрабатываете массив, как если бы противоположные края были смежными? –

ответ

0

Во-первых, укажите, интересуетесь ли вы 4-связанной областью или 8-подключенным. 4-связной окрестностью являются ячейки выше, слева, справа и ниже ячейки. 8-связной окрестностью являются те же ячейки плюс диагональ.

Теперь вам просто нужно вычислить индексы конкретной ячейки.

Вот пример вычисления индекса столбца слева от другого.

int getLeftIndex(int index, int width) { 
    int rv = index - 1; 
    if (index < 0) { index = width - 1; } 
    return rv; 
} 

Аналогичные методы могут вычислять индекс столбца вправо или индекс строки выше или ниже.

Вызовите два метода, чтобы получить как соответствующие строки, так и столбцы.

Вы также можете обобщить это, чтобы предоставить один метод, который принимает дельта в любом направлении, чтобы вы могли перебирать ячейки.

public static int getCoord(int from, int delta, int size) { 
    return Math.floorMod(from + delta, size); // Requires Java 8 
} 

Java также предоставляет оператору модуль, но won't give you the results you want.

Вот пример зацикливания над 8-соединенных клеток вокруг другой:

public static void main(String[] args) { 
    int x = 0; 
    int y = 0; 
    int size = 4; 

    for (int i = -1; i <= 1; ++i) { 
     for (int j = -1; j <= 1; ++j) { 
      if (i != 0 || j != 0) { 
       int xij = getCoord(x, i, size); 
       int yij = getCoord(y, j, size); 
       System.out.println("x=" + xij + " y=" + yij); 
      } 
     } 
    } 

}