Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите решить задачу на c++

Глухов Алексей Ученик (99), на голосовании 1 неделю назад
В период засухи существует опасность лесных пожаров. Чем раньше получится ликвидировать пожар, тем меньший вред он нанесет. Поэтому для предотвращения больших пожаров создана мобильная пожарная бригада. Для мониторинга ситуации проводится аэросъемка местности. Территория разбивается на квадратные участки (клетки), сторона каждой из которых равна 1 км. Клетки нумеруются по принципу: столбцы обозначаются буквами латинского алфавита, а строки — числами. Клетка может содержать лес или пустое пространство. Для ликвидации пожара высылается пожарная бригада, которую доставляют вертолетом максимально близко к точке возгорания. Но приземлиться в любой точке местности вертолет не может. Считается, что точка доступна для посадки, если она находится в центре квадрата из свободных клеток со стороной размера 5, расположенного целиком внутри территории. Необходимо найти количество подходящих под условие задачи точек посадки и расстояние до максимально близкой к точке возгорания клетки, в которую возможно совершить посадку. Если таких клеток найдено несколько, укажите клетку с лексикографически минимальным обозначением столбца и минимальным номером ряда.

Входные данные:
В первой строке входного файла 26.txt находится число N - количество клеток, занятых лесом (натуральное число, не превышающее 10 000).
Каждая из следующих N строк содержит латинскую букву из набора 26 различных букв — обозначение ряда и натуральное число, не превышающих 1000: номер клетки в этом ряду, занятой лесом.
В последней строке вводится латинская буква и натуральное число — координаты клетки, в которой произошло возгорание.

Выходные данные:
Два числа: количество подходящих под условие точек посадки и округленное до целого числа расстояние от ближайшей к точке возгорания точки посадки. Числа разделить пробелом.

Пример входного файла:
4
A 1
C 1
B 2
B 4
B 3
Если считать, что территория ограничена набором из 7 букв от А до G и 7 строк, то под условие посадки подойдут две клетки: Е 4 и Е 5.
Максимально близкая к точке возгорания клетка, доступная для посадки – это Е 4. Расстояние от Е4 до В3 3.16... Округленное до целого значения 3.
Ответ для примера: 2 3
Голосование за лучший ответ
- Профи (660) 1 месяц назад
#include <iostream>
#include <vector>
#include <set>
#include <cmath>

using namespace std;

struct Point {
int row, col;

bool operator<(const Point& other) const {
if (col != other.col) {
return col < other.col;
}
return row < other.row;
}
};

int main() {
int n;
cin >> n;

set<Point> forest;
for (int i = 0; i < n; ++i) {
char colChar;
int row;
cin >> colChar >> row;
int col = colChar - 'A';
forest.insert({row, col});
}

Point fire;
char colChar;
cin >> colChar >> fire.row;
fire.col = colChar - 'A';

int landingCount = 0;
double minDistance = INFINITY;
Point closestLanding;

for (int row = 3; row <= 997; ++row) {
for (int col = 3; col <= 23; ++col) {
bool isLanding = true;
for (int dr = -2; dr <= 2; ++dr) {
for (int dc = -2; dc <= 2; ++dc) {
if (forest.count({row + dr, col + dc})) {
isLanding = false;
break;
}
}
if (!isLanding) break;
}

if (isLanding) {
++landingCount;
double distance = sqrt(pow(row - fire.row, 2) + pow(col - fire.col, 2));
if (distance < minDistance) {
minDistance = distance;
closestLanding = {row, col};
}
}
}
}

cout << landingCount << " " << round(minDistance) << endl;

return 0;
}
Похожие вопросы