fbpx

Problema #841 – Bomber – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se consideră un poligon militar, pe care este stabilit un sistem de axe de coordonate xOy. Se dau n bombe, numerotate de la 1 la n, pentru fiecare cunoscându-se coordonatele x y și puterea de distrugere p. La explozia unei bombe de putere p se va distruge totul în interiorul și pe cercul de centru x y și rază p, iar dacă există alte bombe în această zonă, vor exploda la rândul lor.

Dându-se numărul de ordine I al unei bombe care explodează, să se determine câte bombe rămân intacte la finalul șirului de explozii declanșate.

Date de intrare

Fișierul de intrare bomber.in conține pe prima linie numerele n I, fiecare dintre următoarele n linii conține câte trei numere x y p, cu semnificația din enunț.

Date de ieșire

Fișierul de ieșire bomber.out va conține pe prima linie numărul C, reprezentând numărul de bombe rămase neexplodate.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • 1 ≤ I ≤ n
  • coordonatele x y sunt numere întregi, iar puterile p sunt numere naturale
  • -200 ≤ x , y ≤ 200
  • * 1 ≤ p ≤ 30

Exemplu

bomber.in

9 5
0 3 2
-1 1 3
1 4 1
3 4 4
-1 -2 3
3 1 3
0 -4 2
3 -2 5
4 -1 2

bomber.out

4

Explicație

Bombele sunt dispuse ca în desen:

Mai întâi va exploda bomba colorată cu verde, apoi cele colorate cu roșu, apoi cea colorată cu mov, apoi cea colorată cu negru.

Cele 4 bombe colorate cu albastru nu vor exploda.

#include <bits/stdc++.h>

using namespace std;

ifstream cin("bomber.in");
ofstream cout("bomber.out");

int n , I;

struct shen
{
    int x , y , p;
}v[101];

bool puscate[101];

int dist(int a , int b , int c , int d)
{
    return sqrt((a - c) * (a - c) + (b - d) * (b - d));
}

void pusc(int i , int j , int putere , int q)
{
    puscate[q]=1;
    for(int k = 1 ; k <= n ; ++k)
    {
        if(dist(v[k].x , v[k].y , i , j) <= putere && k!=q && puscate[k]==0)
            pusc(v[k].x , v[k].y , v[k].p , k);
    }
}

int main()
{
    cin >> n >> I;
    for(int i = 1 ; i <= n ; ++i)
        cin >> v[i].x >> v[i].y >> v[i].p;
    pusc(v[I].x , v[I].y , v[I].p , I);
    int cnt=0;
    for(int i = 1 ; i <= n ; ++i)
        if(puscate[i]==0)
            cnt++;
    cout << cnt;
    return 0;
}
Comentarii

S-ar putea sa iti placa