335
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 ≤ 10001 ≤ p ≤ 10p ≤ mşip ≤ n- elementele matricelor sunt
0,1sau2 - 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).
#include <bits/stdc++.h>
using namespace std;
ifstream cin("zoom.in");
ofstream cout("zoom.out");
int a[1002][1002] , v[20][20];
int main()
{
int x , y , z , cnt = 0;
cin >> x >> y >> z;
for(int i = 0 ; i < x ; ++i)
for(int j = 0 ; j < x ; ++j)
cin >> v[i][j];
for(int i = 0 ; i < y ; ++i)
for(int j = 0 ; j < z ; ++j)
cin >> a[i][j];
for(int i = 0 ; i <= y-x ; ++i)
for(int j = 0 ; j <= z-x ; ++j)
{
int ok = 0;
for(int h = i , hi = 0 ; h < i+x ; ++h , ++hi)
for(int g = j , gj = 0 ; g < j+x ; ++g , ++gj)
if(a[h][g] != v[hi][gj])ok = 1;
if(ok == 0) cnt++;
}
cout << cnt;
return 0;
}
Comentarii