Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 10.08.2013
Сообщений: 13

Алгоритм подсчета площади в произвольной фигуре

10.03.2014, 17:21. Показов 2270. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На вход нам поступает массив-карта и 2 координаты точки на этой карте. В массиве есть пустые клетки (0) и стенки (1). Стенки являются периметром фигур. И нужно количество пустых клеток (площадь) той фигуры , куда заключена наша точка
Пример:
В массиве ниже, который состоит из стенок и пустых клеток, есть наша стартовая точка,стенки, и площадь которую надо подсчитать. В данном примере образуются 2 фигуры. Первая зелёная,вторая синяя. Так как стартовая точка находится внутри первой фигуры, нам надо посчитать её площадь. Ответом будет кол-во зелёных точек+розовая точка
map[][]={
0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,1,0,0,0,1,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,0,0,0,0,0,0,0,1,
1,0,1,1,1,0,0,0,0,0,0,0,1,
0,1,0,0,1,0,0,0,0,0,0,0,1,
0,1,0,0,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1
1,0,0,0,0,0,0,0,0,0,0,0,1
1,0,0,0,0,0,0,0,0,0,0,0,1
1,0,0,0,0,0,0,0,0,0,0,0,1
1,0,0,0,0,0,0,0,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1,1,1,1}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2014, 17:21
Ответы с готовыми решениями:

Эффективный алгоритм подсчета расстояний от произвольной вершины до всех стальных вершин в графе
Реализовать в виде программы и исследовать эффективный алгоритм подсчета расстояний от произвольной вершины до всех стальных вершин в...

Описать в классе конструкторы, деструктор, методы вычисления и вывода сведений о фигуре - площади, длины окружности
Создать класс окружность, члена класса - R. Описать в классе конструкторы, деструктор, методы вычисления и вывода сведений о фигуре -...

Как указать нужные по условию ширину и высоту прямоугольника, по площади равного фигуре неправильной формы?
Здравствуйте. Такая вот задача: Проект “Стеклопакет» Произвести расчет стоимости стеклопакета в зависимости от выбранных условий: ...

7
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,925
Записей в блоге: 2
10.03.2014, 18:00
Лучший ответ Сообщение было отмечено virty как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int a[N, N];
bool visited[N, N];
 
int calc( int x, int y )
{
 if (x < 0 || x >= N) return 0;
 if (y < 0 || y >= N) return 0;
 if (visited[x][y] || a[x][y] != 0) return 0;
 visited[x][y] = true;
 int num = 1;
 num += calc(x, y - 1);
 num += calc(x, y + 1);
 
 num += calc(x + 1, y - 1);
 num += calc(x + 1, y + 1);
 
 num += calc(x - 1, y - 1);
 num += calc(x - 1, y + 1);
 return num;
}
 
int main( void ) 
{
// читаем матрицу и заполняем все visited = false
// читаем стартовую точку (x0, y0)
  int square = calc(x0, y0);
  printf("square  = %d\n". square);
  return 0; 
}
1
0 / 0 / 0
Регистрация: 10.08.2013
Сообщений: 13
10.03.2014, 18:30  [ТС]
Это решение такое простое и гениальное... Спасибо!
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,925
Записей в блоге: 2
10.03.2014, 19:00
>> Это решение такое простое и гениальное

Спасибо конечно, но это решение только здесь встречалось уже раз 10 (многие задачи однотипны)
1
0 / 0 / 0
Регистрация: 10.08.2013
Сообщений: 13
10.03.2014, 19:24  [ТС]
Я перед тем как задавать вопрос попытался поискать решение, но даже похожего ничего найти не мог. Ну не суть..
Вообщем теперь вторая проблема. При проверке фигуры 100-100 мне выдало ошибку java.lang.StackOverflowError. То есть надо как то избавляться от таких множественных рекурсий.. Подскажите пожалуйста как избавиться от такой ошибки?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,925
Записей в блоге: 2
10.03.2014, 21:04
Лучший ответ Сообщение было отмечено virty как решение

Решение

Вариант без рекурсии чуть длиннее, но чище (подставите жабячий контейнер)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
int a[N, N];
bool visited[N, N];
typedef std::pair <int, int> TPoint;
std::vector <TPoint> vec;
 
void Add2Calc( int x, int y )
{
 if (x < 0 || x >= N) return;
 if (y < 0 || y >= N) return;
 if (visited[x][y] || a[x][y] != 0) return;
 vec.push_back(TPoint(x, y));
}
 
int main( void ) 
{
// читаем матрицу и заполняем все visited = false
// читаем стартовую точку (x0, y0)
 
  Add2Calc(x0, y0);
  int square = 0;
  while (vec.size()) {
    TPoint pt = vec.back();
    vec.pop_back();
    int x = pt.first, y = pt.second;
    if (visited[x][y]) continue;
    visited[x][y] = true;
    ++square;
 
    Add2Calc(x, y - 1);
    Add2Calc(x, y + 1);
 
    Add2Calc(x + 1, y - 1);
    Add2Calc(x + 1, y + 1);
 
    Add2Calc(x - 1, y - 1);
    Add2Calc(x - 1, y + 1);
  }
 
  printf("square  = %d\n", square);
  return 0; 
}
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
10.03.2014, 21:39
Цитата Сообщение от Igor3D Посмотреть сообщение
C++
1
2
3
4
5
6
num += calc(x, y - 1); 
num += calc(x, y + 1);
num += calc(x + 1, y - 1);
num += calc(x + 1, y + 1);
num += calc(x - 1, y - 1);
num += calc(x - 1, y + 1);
Тут и во втором примере нет горизонтальных соседей, которые могут быть пропущены в некоторых случаях
C++
1
2
 num += calc(x + 1, y);
num += calc(x - 1, y);
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,925
Записей в блоге: 2
11.03.2014, 11:39
Верно, я почему-то решил что соседей 6 (по аналогии с кубиком). А здесь их всего 4, т.к. ходов по диагонали нет. Правильно так
C++
1
2
3
4
Add2Calc(x, y - 1);
Add2Calc(x, y + 1);
Add2Calc(x - 1, y);
Add2Calc(x + 1, y);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2014, 11:39
Помогаю со студенческими работами здесь

1) Создать абстрактный класс Figure с методами вычисления площади и периметра, а также методом, выводящим информацию о фигуре на экран
1) Создать абстрактный класс Figure с методами вычисления площади и периметра, а также методом, выводящим информацию о фигуре на экран. ...

Написать программу подсчета числа слов в произвольной строке
№1 Строки: Написать программу подсчета числа слов в произвольной строке. В качестве разделителя может быть любое число пробелов. ...

Составьте программу подсчета площади равнобедренного треугольника.
Составьте программу подсчета площади равнобедренного треугольника. Если площадь треугольника четная, разделить ее на 2, в противном случае...

Доступ к bitmap и элементам формы из другого потока. Вычисление площади произвольной фигуры
Делаю программу для демонстрации вычисления площади произвольной фигуры различными методами (Монте-Карло, перебор и др.). Фигура создаётся...

Прога для подсчёта площади фигуры в растровой картинке
Например сфотографировали сложную фигуру, наложили на неё систему координат, загнали в прогу, и прога посчитала относительную площадь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru