У меня возникли проблемы с переполнением стека, и, надеюсь, кто-нибудь подскажет мне не / нерекурсивное решение.
Ident[][] map = ...
private int explore(Ident item, int xcoord, int ycoord) {
if ((map[xcoord][ycoord] == null) || !map[xcoord][ycoord].equals(item))
return 0;
map[xcoord][ycoord] = null;
int sumX, sumY, counter = 1;
item.translate(xcoord, ycoord);
for (int y = -1; y <= 1; y++)
for (int x = -1; x <= 1; x++) {
sumX = x + xcoord;
sumY = y + ycoord;
if (((y != 0) || (x != 0)) && (sumX >= 0) && (sumX < map.length) &&
(sumY >= 0) && (sumY < map.[0].length))
counter += explore(item, sumX, sumY);
}
}
}
return counter;
}
Этот метод получает 2-мерный массив Ident Objects, целевой Ident и начальную позицию в массиве. Рекурсивно пересекает массив
считая, насколько большой из непрерывной области занимает Идент. Он также центрирует введенный элемент Ident в центре области.
Зацикливая массив карт и вызывая метод explore для любых ненулевых элементов, я могу создать массив элементов Ident с центром в их областях и с размерами относительно их областей.
Видно, что с любыми картами, кроме маленьких, стек переполняется.
У кого-нибудь есть альтернативный метод выполнения той же задачи? Или какое-то понимание, чтобы помочь мне найти его?