Я создаю простую математическую игру в геометрии шестиугольника через Unity.На самом деле речь идет не об Unity.
Я заимствую Image у https://catlikecoding.com/unity/tutorials/,, чтобы проиллюстрировать проблему, он довольно большой, поэтому я поместил его в ссылку.
Фон
То же, что и в учебнике по приведенной ссылке, я использую массив для сохранения данных, чтобы упростить его, он выглядит так:
[ 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0 ]
Моя цель
Проверить, окружена ли одна или несколько сеток сеткой другого типа.
Определение
Окружен означает для сетки или группы связанных сеток, все соседи находятся в разных флагах из них.
Например,
[ 0, 1, 1, 0,
1, 0, 1, 0,
0, 1, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0 ]
//Should become
[ 0, 1, 1, 0,
1, 1, 1, 0,
0, 1, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0 ]
Это довольно легкодля этого случая мне даже не нужен алгоритм, так как я могу создать сетку со ссылкой на ее соседа, например
class grid{
grid[] neighbor;
int flag; //0 or 1
}
Итак, когда мне нужно проверить, окружена ли сетка, мне просто нужнозацикливать его neighbor
.
Проблема
Однако этот метод становится утомительным в следующем случае
[ 0, 1, 1, 1,
1, 0, 0, 1,
0, 1, 1, 1,
0, 0, 0, 0,
0, 0, 0, 0 ]
Итак, мне также нужно проверить соседа его соседа, например,
foreach (grid i in neighbor){
bool is_surrounded = false;
if (grid.flag == 1) {
//Good
} else {
//Check its neighbor, if every neighbor except i is 1, then return True.
}
}
Он отлично работает для 2, но что, если есть 3 пустых сетки?Рекурсия не в порядке, например, когда сетка не окружена, как
[ 0, 1, 1, 1,
1, 0, 0, 1,
0, 1, 0, 1,
0, 0, 0, 0,
0, 0, 0, 0 ]
, тогда я зациклю всю карту для проверки около 8 ^ n раз.
Вопрос
Я думаю, что есть более умный метод, который я не осознавал, я приветствую любой вид / язык ответа или даже просто идею.Конечно, я буду щедро вознагражден за работу и объяснение.
Спасибо.