Pbinfo #841 Bomber
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

Răspuns :

Răspuns:

#include<fstream>

#include<cmath>

using namespace std;

ifstream cin("bomber.in");

ofstream cout("bomber.out");

struct bomb

{

   int x,y,p,on;

}v[101];

inline int comp(int ind,int j)

{

   return sqrt((v[ind].x-v[j].x)*(v[ind].x-v[j].x)+(v[ind].y-v[j].y)*(v[ind].y-v[j].y))<=v[ind].p;

}

inline void exploziv(int ind,int n)

{

   v[ind].on=1;

   for(int i=1;i<=n;i++)

       if(!v[i].on)

   {

       if(comp(ind,i))

           exploziv(i,n);

   }

}

int main()

{

   static int n,ind,k;

   cin>>n>>ind;

   for(int i=1;i<=n;i++)

       cin>>v[i].x>>v[i].y>>v[i].p;

   exploziv(ind,n);

   for(int i=1;i<=n;i++)

       if(!v[i].on)

           k++;

   cout<<k;

}

Explicație: