Probleme de informatica - enunturi si rezolvari

Probleme de informatică
Clasa a IX-a
Elementele de bază C++ (46)
Subprograme predefinite (1)
Fişiere text (2)
Algoritmi elementari (109)
Tablouri unidimensionale (83)
Tablouri bidimensionale (64)
Probleme diverse (13)
Clasa a X-a
Subprograme (funcții) (87)
Şiruri de caractere (49)
Tipul înregistrare (26)
Recursivitate (57)
Alocarea dinamică a memoriei (2)
Liste înlănţuite (25)
Algoritmul lui Lee (1)
Clasa a XI-a
Metoda "Divide et impera" (12)
Metoda Backtracking (85)
Metoda Greedy (6)
Programare dinamică (18)
Grafuri neorientate (37)
Grafuri orientate (38)
Arbori (33)
Clasa a XII-a
Elemente de bază C# (32)
POO în C# (13)
Programare vizuală în C# (10)
Examen de bacalaureat
Competențe digitale
Examen de atestat
Admitere UBB (18)
Se dau n bombe, numerotate de la 1 la n, pentru fiecare cunoscandu-se coordonatele (x,y) unde sunt plasate si raza de distrugere r. La explozia unei bombe se va distruge totul in interiorul si pe cercul de centru (x,y) si raza r, iar daca exista alte bombe in aceasta zona, acestea vor exploda la randul lor. Se da indicele k al primei bombe care explodeaza si se cere sa se calculeze cate bombe raman neexplodate.
Datele se citesc din fisierul bombe.in si rezultatele se vor afisa in fisierul bombe.out.
In fisierul bombe.in pe prima linie se afla numerele n si k, iar pe urmatoarele n linii coordonatele si razele de distrugere ale celor n bombe. n si k sunt numere naturale, coordonatele numere intregi, iar razele numere naturale.
Exemplu:
bombe.in
8 5
4 5 4
-3 -4 1
4 1 1
2 1 3
2 2 2
1 1 2
-1 1 2
-3 3 3
bombe.out
3
Explicatie: Prima explodeaza bomba rosie (a 5-a), ea declanseaza cele doua bombe verzi, iar fiecare dintre cele verzi declaseaza cate una albastra. Bombele negre raman neexplodate.

#include <fstream>
using namespace std;
ifstream fin("bombe.in");
ofstream fout("bombe.out");

struct bomba
{
    int x,y,p,e;
};

bomba B[101];
int n,k;

double dist2(int x, int y, int a, int b)
{
    return (x-a)*(x-a)+(y-b)*(y-b);
}

void explozie(int k)
{
    B[k].e=1;
    for(int i=1;i<=n;i++)
        if(B[i].e==0 && dist2(B[k].x, B[k].y, B[i].x, B[i].y)<=B[k].p*B[k].p)
            explozie(i);
}

int main()
{
    int c=0;
    fin>>n>>k;
    for(int i=1;i<=n;i++)
        {
            fin>>B[i].x>>B[i].y>>B[i].p;
            B[i].e=0;
        }
    explozie(k);
    for(int i=1;i<=n;i++)
        if(B[i].e==0) c++;
    fout<<c;
    fin.close();
    fout.close();
    return 0;
}

21 aug 2018
Site-ul conține 867 de probleme rezolvate
Copyright © 2009-2018 Muresan Vasile Ciprian