fbpx

Problema #1478 – EasyOCR – Rezolvari PBInfo

de Mihai-Alexandru

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 1 apare de 2 ori;
  • cifra 3 apare o singură dată;
  • cifra 5 apare o singură dată;
  • cifra 7 apare 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

S-ar putea sa iti placa