Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
891
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
946
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
936
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1723
0
период по дням
25th October, 10:44
3954
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4379
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4394
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4001
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2597
0
Решение задачи Дырявая ткань с Меньшиков
Без пояснения   Просмотров: 1115
На столе лежат несколько кусков ткани, не перекрывая друг друга. Эти куски могут иметь дыры, в том числе и настолько большие, что в них может поместиться целый кусок ткани. Был получен чёрно-белый образ поверхности стола, на котором области, покрытые тканью, представлены символами *, а свободные площади - точками. Один кусок ткани, таким образом, представлен 4-связной областью символов *, то есть группой *, соседствующих друг с другом горизонтально или вертикально, но не по диагонали.
.***..***
.*.*.**.*
.***.*.**
*...**.*.
На схеме три куска - один без дыр, а два - с одной дырой каждый: первый площадью 8, второй - площадью 12.
Ваша цель - найти кусок с наибольшим количеством дыр в нём. Дыра - это 4-связная область точек, полностью окружённых символами *. Если несколько кусков имеют одинаковое количество дыр, нужно выбрать кусок минимальной площади.
.***..***
.*.*.**.*
.***.*.**
*...**.*.
На схеме три куска - один без дыр, а два - с одной дырой каждый: первый площадью 8, второй - площадью 12.
Ваша цель - найти кусок с наибольшим количеством дыр в нём. Дыра - это 4-связная область точек, полностью окружённых символами *. Если несколько кусков имеют одинаковое количество дыр, нужно выбрать кусок минимальной площади.
Код
#include #include #include #include #include using namespace std; const int MAX_SIZE = 110; const int FREE = 0; const int USED = 7; int n,m; vector > mas; void input() { cin>>m>>n; mas = vector >(n+4,vector (m+4,0)); char str[MAX_SIZE]; for (int i=2;i holes; vector squares; bool correct(int x, int y) { if (x<0 || y<0) return false; if (x==n+4 || y==m+4) return false; return true; } int bfs1(int X, int Y, vector > &one, int &minX, int &maxX, int &minY, int &maxY) { int S = 1; mas[X][Y] = FREE; one[X][Y] = USED; queue q; q.push(point(X,Y)); while (!q.empty()) { point cur = q.front(); q.pop(); for (int i=0;i<4;i++) { int x = cur.x + moveX[i]; int y = cur.y + moveY[i]; if (correct(x,y) && mas[x][y] == USED) { minX = min(minX, x); maxX = max(maxX, x); minY = min(minY, y); maxY = max(maxY, y); S++; mas[x][y] = FREE; one[x][y] = USED; q.push(point(x,y)); } } } return S; } void prepare(vector > &one, int minX, int maxX, int minY, int maxY) { for (int i = minX - 1; i <= maxX + 1; i++) { one[i][minY-1] = FREE; one[i][minY-2] = USED; one[i][maxY+1] = FREE; one[i][maxY+2] = USED; } for (int i = minY - 1; i <= maxY + 1; i++) { one[minX-1][i] = FREE; one[minX-2][i] = USED; one[maxX+1][i] = FREE; one[maxX+2][i] = USED; } } void bfs2 (vector > &one, int x, int y) { one[x][y] = USED; queue q; q.push(point(x,y)); while (!q.empty()) { point cur = q.front(); q.pop(); for (int i=0;i<4;i++) { int x = cur.x + moveX[i]; int y = cur.y + moveY[i]; if (one[x][y] == FREE) // проверка correct(x,y) не нужна { one[x][y] = USED; q.push(point(x,y)); } } } } int findHols(vector > &one, int minX, int maxX, int minY, int maxY) { int holesAmount = -1; for (int i = minX - 1; i < maxX + 1; i++) { for (int j = minY - 1; j< maxY + 1; j++) { if (one[i][j] == FREE) { bfs2(one, i, j); holesAmount++; } } } return holesAmount; } void solve() { vector > one = vector >(n+4,vector (m+4)); for (int i=2;i
 
 
 
 
 
Автор: Администратор
Автор: Администратор
Комментарии
info@mycod.net  
Карта сайта  
Правообладателям
Заявка на расчет
×
или напишите нам прямо сейчас: