Rezolvare completă PbInfo #565 Acoperire

Cerința

Gigel deține un teren de formă dreptunghiulară, împărțite în n•m sectoare, dispuse pe n linii și m coloane. În anumite sectoare sunt instalate camere de luat vederi. Fiecare cameră acoperă anumite sectoare ale terenului, pe diagonală și are o anumită putere k reprezentând numărul de sectoare pe care le acoperă pe fiecare din cele 4 direcții, inclusiv sectorul în care se află camera.

În figura de mai jos sunt afișate sectoarele acoperite de o cameră de putere 3.

Determinați câte sectoare ale terenului nu sunt acoperite de nici o cameră.

Date de intrare

Programul citește de la tastatură numerele n m k, reprezentând dimensiunile terenului și numărul de camere, apoi k triplete i j p, reprezentând coordonatele fiecărei camere șî puterea ei.

Date de ieșire

Programul va afișa pe ecran numărul C, reprezentând numărul de sectoare neacoperite.

Restricții și precizări

  • 1 ≤ n , m ≤ 1000
  • 1 ≤ p ≤ 1000
  • 1 ≤ i ≤ n
  • 1 ≤ j ≤ m
  • 1 ≤ p ≤ min(n,m)
  • o cameră poate acoperi un sector în care se află o altă cameră

Exemplu

Intrare

5 7 4
1 7 2		
2 3 3		
4 2 3		
4 5 4		

Ieșire

16

Explicație

Exemplul corespunde imaginii de mai jos, în care sectoarele acoperite sunt marcate cu gri.

Camera din sectorul 4 5 acoperă și sectorul 1 2.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Acoperire:

#include <iostream>
using namespace std;

int n,m,k,a[1005][1005];
int di[] = {1,1,-1,-1},
    dj[] = {1,-1,1,-1};

int main()
{
    int i,j,p;
    cin >> n >> m >> k;
    for( ; k ; --k)
    {
        cin >> i >> j >> p;
        for(int pp = 0 ; pp < p ; pp ++)
            for(int x = 0 ; x < 4 ; x ++)
            {
                int ii = i + pp * di[x], jj = j + pp * dj[x];
                if(ii > 0 && ii <= n && jj > 0 && jj <= m)
                    a[ii][jj] ++;
            }
    }
    int cnt = 0;
    /*
    for(int i = 1 ; i <= n ; ++i)
    {
        for(int j = 1 ; j <= m ; ++j )
            cout << a[i][j] << " ";
        cout << endl;
    }
    */
    for(int i = 1 ; i <= n ; ++i)
        for(int j = 1 ; j <= m ; ++j )
            if(a[i][j] == 0)
                cnt ++;
    cout << cnt;
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #565 Acoperire

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #565 Acoperire de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!