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)
.
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 zoom:
#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;
}
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 .
Rezolvarea problemei #1527 zoom
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1527 zoom 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!