Знаю, что решение должно лежать на поверхности, но пока никаких "легких" вариантов в голову не приходит. Собственно, дан двумерный булевый массив со случайным распределением значений. Нужно найти количество "островов", образованных всеми true-значениями, "островом" считается набор true-ячеек, которые соседствуют друг с другом по-вертикали или по-горизонтали (или одна отдельная ячейка). Надеюсь, понятно объяснил Крайне желательно при поиске островов использовать pThreads. Пока приходит в голову только итерация по массиву с запуском потока поиска в случае нахождения true, но тогда количество потоков будет заранее не определено, что нехорошо. Подскажите, пожалуйста, как грамотнее всего решить эту задачу? Язык - C++, система - Linux.
Я си плохо знаю поэтому примерно только. Мб так: Код (Text): int get_num_of_isles(bool* array, int x_max, int y_max) { int num_of_isles; for(y=0; y<=y_max; y++) { for(x=0; x<=x_max; x++) { if(array[x][y]) { num_of_isles++; array[x][y]=false; // удаляем найденные точки чтоб потом не было ложных детектов search_neighbours(array, x, y, x_max, y_max); } } } return num_of_isles; } void search_neighbours(bool* array, int x, int y, int x_max, int y_max) { if((array[x-1][y-1])&&(y>0)&&(x>0)) { array[x-1][y-1]=false; search_neighbours(array, x-1, y-1, x_max, y_max); } if((array[x][y-1])&&(y>0)) { array[x][y-1]=false; search_neighbours(array, x, y-1, x_max, y_max); } if((array[x+1][y-1])&&(y>0)&&(x<x_max)) { array[x+1][y-1]=false; search_neighbours(array, x+1, y-1, x_max, y_max); } if((array[x-1][y])&&(x>0)) { array[x-1][y]=false; search_neighbours(array, x-1, y, x_max, y_max); } if((array[x+1][y])&&(x<x_max)) { array[x+1][y]=false; search_neighbours(array, x+1, y, x_max, y_max); } if((array[x-1][y+1])&&(y<y_max)&&(x>0)) { array[x-1][y+1]=false; search_neighbours(array, x-1, y+1, x_max, y_max); } if((array[x][y+1])&&(y<y_max)) { array[x][y+1]=false; search_neighbours(array, x, y+1, x_max, y_max); } if((array[x+1][y+1])&&(y<y_max)&&(x<x_max)) { array[x+1][y+1]=false; search_neighbours(array, x+1, y+1, x_max, y_max); } } ред. немного поправил код
методом раскраски. просматриваете карту построчно, при встрече нераскрашенного острова - раскрашиваете его в очередной цвет (обычный алгоритм заливки цветом). и так до конца карты. количество цветов в которые вы раскрасили == количество островов.
Метод раскраски годный, добавлю только что его можно распараллелить. Если разбить массив на горизонтальные или вертикальные сегменты и каждый поток запускать для своего сегмента. После нужно будет объединить цвета на стыках, сделать это можно дополнительным проходом в этих стыках. Для этого можно завести отдельный массив реальных цветов. Идём по стыку, видим что цвета объединились и записываем в их ячейки реальный цвет(любой из этих двух). Если объединяются цвета которые уже ранее были объединёнными, то придётся искать по-этому массиву, чтобы установить реальный цвет для всех уже ранее объединённых. Тут есть некоторый простор для оптимизации.