Cod sursa(job #2343810)

Utilizator CopsiManFilip Rares CopsiMan Data 14 februarie 2019 12:48:10
Problema A+B Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 6.01 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <algorithm>

#define NMAX 180

using namespace std;

ifstream f ("adunare.in");
ofstream g ("adunare.out");

// bitset<NMAX> a[NMAX];
short int a[NMAX][NMAX];
int n, m, size, sizem, nrPar, nr, nrBombe, I, k, n1, n2,
    dx[4] = {-1, 0, 1, 0},
            dy[4] = {0, 1, 0, -1};

struct zona
{
    int x,y;
} v[NMAX*NMAX];

struct bombe
{
    float x, y, p;
    bool active = true;
} b[NMAX];

void afisareT ()
{
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<m; j++)
            cout<<a[i][j]<<' ';
        cout<<'\n';
    }
    cout<<'\n';
}

int sum3 (int v[], int n)
{
    if (n == 0)
        return 0;
    if (v[n-1] % 3 == 0)
        return sum3(v,n-1) + v[n-1];
    else
        return sum3(v,n-1);
}

void citire ()
{
    int x,y;
    f>>n>>m>>k;
    for (int i=0; i<k; i++)
    {
        f>>x>>y;
        a[n-x][y-1]++;
    }
}

void lee(int x, int y)
{
    a[x][y] = -1;
    for (int k = 0; k < 4; k++)
        if (dx[k] + x >= 0 &&
                dx[k] + x < n &&
                dy[k] + y >= 0 &&
                dy[k] + y < m)
            if (a[dx[k] + x][dy[k] + y] == 0)
                lee(dx[k] + x, dy[k] + y);
            else if (a[dx[k] + x][dy[k] + y] > sizem)
                sizem = a[dx[k] + x][dy[k] + y];
}

void lee1(int x, int y)
{
    a[x][y] = 0;
    for (int k = 0; k < 4; k++)
        if (dx[k] + x >= 0 &&
                dx[k] + x < n &&
                dy[k] + y >= 0 &&
                dy[k] + y < m)
            if (a[dx[k] + x][dy[k] + y] == -1)
                lee1(dx[k] + x, dy[k] + y);
            else if (a[dx[k] + x][dy[k] + y] == sizem)
            {
                size++;
                a[dx[k] + x][dy[k] + y] = 0;
            }
}

void complete()
{
    for(int i=0; i<size; i++)
        a[v[i].x][v[i].y]=size;
    size = 0;
}

void CMMI()
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (a[i][j] == 1)
            {
                afisareT();
                nr++;
                size = 0;
                lee(i, j);
                if (size > sizem)
                    sizem = size;
            }
            complete();
        }
    }
}

bool prim (int a)
{
    if (a == 2)
        return true;
    if (a<2 || a%2==0)
        return false;
    int d = 3;
    while (d*d<=a)
    {
        if (a%d==0)
            return false;
        d+=2;
    }
    return true;
}

void P (int x[], int n, int &s)
{
    s=0;
    if (n > 1)
        P(x, n-1, s);
    if (prim(x[n-1]))
        s += x[n-1];
}

int suma(int v[], int n, int i, int j)
{
    if (n<1)
        return 0;
    if (n > j || n < i)
        return suma(v,n-1,i,j) + v[n];
    else
        return suma(v,n-1,i,j);
}

void afisare ()
{
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<m; j++)
            g<<a[i][j]<<' ';
        g<<'\n';
    }
}

void citireBombe()
{
    f>> nrBombe >> I;
    for (int i=0; i<nrBombe; i++)
        f>>b[i].x>>b[i].y>>b[i].p;
}

bool inRange(bombe a, bombe b)
{
    float range, dx, dy, distance;
    range = a.p;
    dx = a.x - b.x;
    dy = a.y - b.y;
    distance = dx*dx + dy*dy;
    if (range*range >= distance)
        return true;
    else
        return false;
}

void boom(int k)
{
    b[k].active = false;
    for (int i=0; i<nrBombe; i++)
        if (b[i].active)
            if (inRange(b[k],b[i]))
                boom(i);
}

void count ()
{
    int k=0;
    for (int i=0; i<nrBombe; i++)
        if (b[i].active)
            k++;
    g<<k;
}

void afis()
{
    int a;
    cin>>a;
    if (a)
        afis();
    cout<<a<<' ';
}

void afisvec1(int v[], int n)
{
    if (n>0)
    {
        cout<<v[n-1]<<' ';
        afisvec1(v,n-1);
    }
}

void afisvec(int v[], int n)
{
    if (n>0)
    {
        afisvec(v,n-1);
        cout<<v[n-1]<<' ';
    }
}

void P (int v[], int n, int& mini, int& maxi, int& sum)
{
    mini = 1000000;
    maxi = -1000000;
    sum = 0;
    if (n>1)
        P(v,n-1,mini,maxi,sum);
    sum+=v[n-1];
    if (v[n-1]>maxi)
        maxi = v[n-1];
    if (v[n-1]<mini)
        mini = v[n-1];
}

int cautare(int n, double x[], double v)
{
    if (n>1)
        if (x[n-1]==v)
            return n-1;
        else
            return cautare(n-1,x,v);
    else
        return -1;
}

void num (int n, int v[])
{
    if (v[n-1] <= v[0])
        v[n-1] = 0;
    if (n>1)
        num(n-1,v);
}

void quickSort(int arr[], int left, int right)
{
    int i = left, j = right;
    int tmp;
    int pivot = arr[(left + right) / 2];

    /* partition */
    while (i <= j)
    {
        while (arr[i] < pivot)
            i++;
        while (arr[j] > pivot)
            j--;
        if (i <= j)
        {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };

    /* recursion */
    if (left < j)
        quickSort(arr, left, j);
    if (i < right)
        quickSort(arr, i, right);
}

void ordonare1 (int v[], int n)
{
    quickSort(v,0,n-1);
}

void ordonare (int a[], int n, int st, int dr)
{
    quickSort(a,st,dr);
}

int main()
{
    int a, b;
    f>>a>>b;
    g<<a+b;
    /*
    int n = 6, a[NMAX] = {63,273,9,83,93,123}, mini, maxi, sum;
    double x[NMAX] = {9.5,16.3,28.3,49.7,52.4,73}, v = 52.4;
    ordonare(a,n,1,3);
    for (int i=0; i<n; i++)
        cout<<a[i]<<' ';
    cout<<mini<<' '<<maxi<<' '<<sum;
    num(n,a);
    P(v,n,mini,maxi,sum);
    afisvec(v,n);
    citire();
    lee(n-1,0);
    lee1(n-1,0);
    // afisare();
    n1 = sizem;
    n2 = size;
    g<<n1<<'\n'<<n2;
    // cout<<sizem;
    afis();
    citireBombe();
    boom(I-1);
    count();
    CMMI();
    int n = 6, v[NMAX] = {0, 12, 7, 6, 3, 8, 5}, i = 2, j = 4;
    cout<<suma(v,n,i,j);
    g<<nr<<' '<<sizem<<' '<<nrPar;
    */
    return 0;
}