# PBinfo #1527 – zoom – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Se dă o matrice pătratică de ordin p şi alta cu m linii şi n coloane, ale căror elemente sunt egale cu 0, 1 sau 2. Determinaţi numărul de apariţii ale primei matrice în a doua.

Date de intrare
Fișierul de intrare zoom.in conține pe prima linie numerele p,m,n, pe următoarele p linii câte p numere naturale, iar pe următoarele m linii câte n numere naturale, reprezentând elementele celor două matrice.

Date de ieșire
Fișierul de ieșire zoom.out va conține pe prima linie numărul de apariţii ale primei matrice în a doua.

Restricții și precizări

2 ≤ m , n ≤ 1000
1 ≤ p ≤ 10
p ≤ m şi p ≤ n
elementele matricelor sunt 0,1 sau 2
prima matrice apare în a doua dacă există o submatrice în a doua ale cărei elemente să coincidă cu ale primei matrice

Exemplu:
zoom.in

2 4 5
0 1
2 1
1 2 0 1 2
0 1 2 1 2
2 1 2 0 1
1 1 1 2 1
zoom.out

3
Explicație
Prima matrice apare în a doua în trei poziţii astfel încât colţul stânga sus al său să coincidă pe rând cu elementele din a doua matrice situate în poziţiile (1,3),(2,1),(3,4).

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream f("zoom.in");
ofstream g("zoom.out");
short int a[1001][1001];
long long put[11] , val[1001], va[11] , x ;
long p , m , n , i , j , nr , ok , k ;
int main()
{
    f >> p >> m >> n ;
    put[0]=1 ;
    for ( i=1 ; i<=p ; i++ ) put[i]=put[i-1]*3 ;
    for ( i=1 ; i<=p ; i++ )
       for ( j=1 ; j<=p ; j++ )
        {
            f >> x ;
            va[j] += x*put[i-1] ;
        }
    for( i=1 ; i<=p-1 ; i++ )
    {
        for( j=1; j<=n ; j++ )
        {
            f >> a[i][j] ;
            val[j] += a[i][j]*put[i-1] ;
        }
    }
    for( j=1 ; j<p ; j++ )
    {
       f >> a[p][j] ;
       val[j] += a[p][j]*put[p-1] ;
    }
    for( j=p ; j<=n ; j++ )
    {
       f >> a[p][j] ;
       val[j] += a[p][j]*put[p-1] ;
       ok=1 ;
       for ( k=p ; k>=1 ; k-- )
         if ( va[k]!=val[j+k-p]){ ok=0 ; break ; }
       nr +=ok ;
    }
    for ( i=p+1 ; i<=m ; i++ )
    {
       for( j=1 ; j<p ; j++ )
       {
          f >> a[i][j] ;
          val[j] = ( val[j]-a[i-p][j])/3+a[i][j]*put[p-1] ;
       }
       for( j=p ; j<=n ; j++ )
       {
          f >> a[i][j] ;
          val[j] = ( val[j]-a[i-p][j])/3+a[i][j]*put[p-1] ;
          ok=1 ;
          for ( k=p ; k>=1 ; k-- )
            if ( va[k]!=val[j+k-p]){ ok=0 ; break ; }
          nr +=ok ;
       }
    }
    g << nr ;
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1527)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1527/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1527/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
