306
Prin OCR (Optical Character Recognition) se înţelege tehnologia prin care un program de calculator identifică textul dintr-un fișier în care acesta nu e stocat ca şiruri de caractere, ci ca ansamblu de pixeli (imagine).
Să presupunem că am scanat o imagine alb negru care conţine doar cifre. Cifrele sunt formate din puncte (pixeli) negre iar fundalul din puncte albe. Imaginea va fi reprezentată ca un tablou dreptunghiular de cifre 0 şi 1, cifrele 1 formează obiectele din imagine iar cifrele 0 fundalul.
Cerinţă
Scrieţi un program care să determine:
a) câte cifre sunt în imagine;
Exemplu
easyocr.in
17 15 000000000000000 011111000000000 010000000000000 010000000000000 011111000000001 000001000000011 000001011111001 011111000001001 000000000001001 011111000010001 000001000100101 000001000101100 011111000100100 000001000000100 000001000000100 011111000000100 000000000000100
easyocr.out
5 1 2 3 1 5 1 7 1
Explicație

În imagine se află 5 cifre unde:
- cifra
1apare de2ori; - cifra
3apare o singură dată; - cifra
5apare o singură dată; - cifra
7apare tot o singură dată.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("easyocr.in");
ofstream cout("easyocr.out");
bool a[1011][1011] , b[1011][1011];
int f[10] , n , m;
bool in(int i , int j)
{
return i <= n && i >= 1 && j <= m && j >= 1;
}
void fill(int i , int j , int &cnt)
{
a[i][j]=0;
cnt++;
if(a[i+1][j]==1 && in(i+1 , j))
fill(i+1 , j , cnt);
if(a[i-1][j]==1 && in(i-1 , j))
fill(i-1 , j , cnt);
if(a[i][j+1]==1 && in(i , j+1))
fill(i , j+1 , cnt);
if(a[i][j-1]==1 && in(i , j-1))
fill(i , j-1 , cnt);
if(a[i+1][j-1]==1 && in(i+1 , j-1))
fill(i+1 , j-1 , cnt);
}
int main()
{
cin >> n >> m;
char ch;
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
{
cin >> ch;
a[i][j]=ch - '0';
b[i][j]=a[i][j];
}
int nr=0;
for(int i = 1 ; i <= n ; ++i)
{
for(int j = 1 ; j <= m ; ++j)
{
if(a[i][j]==1)
{
nr++;
int cnt=0;
fill(i , j , cnt);
if(cnt==20)
f[0]++;
else if(cnt==8)
f[1]++;
else if(cnt==19)
{
if(b[i+4][j]==1)
f[2]++;
else if(b[i+1][j+4]==1)
f[3]++;
else
f[5]++;
}
else if(cnt==14)
f[4]++;
else if(cnt==21)
{
if(b[i+1][j+4]==1)
f[9]++;
else
f[6]++;
}
else if(cnt==11)
f[7]++;
else if(cnt==23)
f[8]++;
}
}
}
cout << nr << endl;
for(int i = 0 ; i <= 9 ; ++i)
if(f[i]>0)
cout << i << ' ' << f[i] << ' ';
return 0;
}
Comentarii