Rezolvare completă PbInfo #600 Romburi

Cerința

Plictisindu-se la ora de matematică, Gigel a luat o foaie de pătrățele cu n linii și m coloane și a început să deseneze romburi, fiecare având forma din imagine și diferite dimensiuni. Este posibil ca unele romburi să fie incomplet desenate, datorită apropierii de marginea foii. În plus, unele romburi se pot suprapune. În felul acesta o parte dintre pătrățelele de pe foaie sunt colorate, altele sunt intacte. Pentru fiecare romb desenat (chiar incomplet), Gigel a notat pe altă foaie coordonatele (linie, coloană) colțului de sus și dimensiunea.

Determinați numărul de pătrățele de pe foaie care sunt intacte, după desenarea romburilor.

Date de intrare

Fișierul de intrare romburi.in conține pe prima linie numerele n m p. Următoarele p linii conțin numerele i j L, reprezentând un romb cu vârful de sus la coordonatele i j cu Lungimea laturii L.

Date de ieșire

Fișierul de ieșire romburi.out va conține pe prima linie numărul C de pătrățele intacte.

Restricții și precizări

  • 1 ≤ n,m, L ≤ 1000
  • 1 ≤ p ≤ 100

Exemplu

romburi.in

12 13 5
4 5 4
2 3 2
3 8 3
2 11 1
8 11 5

romburi.out

93

Explicație

Exemplul corespunde imaginii de mai jos. În exemplu două romburi se suprapun si unul este incomplet.

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 Romburi:

//problema romburi

#include <iostream>
#include <fstream>
//#define DEBUG
using namespace std;

ifstream fin("romburi.in");
ofstream fout("romburi.out");

int A[1005][1005], n, m , p , a , b , L;

int main(){
    fin  >> n >> m >> p;
    for( ; p ; --p)
    {
        fin >> a >> b >> L;
        int i = a;
        for(int k = 0 ; k < L ; k ++)
        {
            for(int j = b - k; j <= b + k; j ++)
                if(i > 0 && i <= n && j > 0 && j <= m)
                    A[i][j] ++;
            i ++;
        }
        i = a + 2 * (L-1);
        for(int k = 0 ; k < L - 1 ; k ++)
        {
            for(int j = b - k; j <= b + k; j ++)
                if(i > 0 && i <= n && j > 0 && j <= m)
                    A[i][j] ++;
            i --;
        }
    }
    #ifdef DEBUG
    for (int i = 1 ;i <= n ; ++i)
    {
        for(int j = 1 ; j <= m ; ++j)
            cout << A[i][j] << " ";
        cout << endl;
    }
    #endif
    int C = 0;
    for (int i = 1 ;i <= n ; ++i)
        for(int j = 1 ; j <= m ; ++j)
            if(A[i][j] == 0)
                C ++;
    fout << C ;
    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 #600 Romburi

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #600 Romburi 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!