Michael Koops Ответов: 2

Как разделить и подсчитать кластеры (4 связанных компонента направления) в 2D-массиве?


for example, I have 2d array like this:

 1 2 2 2 2 1 1 1 1 2 1 1
 2 1 1 1 2 1 2 2 1 1 2 1
 2 2 1 2 1 1 2 2 2 2 1 1
 1 1 1 2 1 2 1 2 2 1 1 2 
 1 1 2 1 2 1 2 1 2 2 2 2
 1 1 2 2 2 2 1 2 1 2 1 1 
 2 1 1 2 1 1 2 2 1 1 1 2

And I want to label the connected components (4 directions)to be like this:

 1  2  2  2  2  3  3  3  3  4  5  5
 6  7  7  7  2  3  8  8  3  3  9  5
 6  6  7  10 3  3  8  8  8  8  5  5
 7  7  7  10 3  11 12 8  8  5  5  8 
 7  7  13 14 13 15 16 17 8  8  8  8
 7  7  13 13 13 13 18 19 20 8  20 20 
 21 7  7  13 22 22 19 19 20 20 20 23

the way to label the clusters is like the flood fill, if it connects to their neighbor by up-down-left-right direction, they will be grouping in the same cluster. we go from top left to bottom right. Please help me solve this problem. Thanks!!!(javascript code example would be great)


Что я уже пробовал:

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

2 Ответов

Рейтинг:
1

Rick York

У вас может быть еще один 2D-массив, который находится "параллельно" с первым 2D-массивом. Он будет содержать значения, указывающие, в каком кластере находится значение. Это будет по умолчанию равно нулю, что означает отсутствие кластера. Затем сохраните счетчик кластеров, начиная с одного, который вы назначаете членам кластера, когда находите его. Таким образом, для каждого значения в исходном массиве вы можете посмотреть во втором массиве, и он скажет, в каком кластере находится данное значение. Есть много уточнений, которые вы можете добавить к этому, но именно так я бы подошел к этой проблеме.


Рейтинг:
0

Patrice T

Цитата:
Пожалуйста, помогите мне решить эту проблему. Спасибо!!!(пример кода javascript был бы отличным)

Мы не делаем вашу домашнюю работу.
Домашнее задание предназначено не для того, чтобы проверить ваши навыки просить других людей сделать вашу работу, оно предназначено для того, чтобы заставить вас думать и помочь вашему учителю проверить ваше понимание курсов, которые вы прошли, а также проблем, с которыми вы сталкиваетесь при их применении.
Любая ваша неудача поможет учителю выявить ваши слабости и наметить меры по их исправлению.
Итак, попробуйте, перечитайте свои уроки и приступайте к работе. Если вы застряли на конкретной проблеме, покажите свой код и объясните эту точную проблему, мы можем помочь.

Как программист, ваша задача-создавать алгоритмы это решает конкретные проблемы, и вы не можете полагаться на кого-то другого, чтобы вечно делать это за вас, поэтому есть время, когда вам придется научиться этому. И чем скорее, тем лучше.
Когда вы просто просите решение, это все равно что пытаться научиться водить машину, обучая кого-то другого.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.

совет: возьмите лист бумаги и решите задачу вручную (механически). Этот метод вы должны перевести в программу.

Мы оказываем помощь по конкретным проблемам!
Так что покажите свой код и объясните проблему.