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
şip ≤ n
- elementele matricelor sunt
0,1
sau2
- 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; }