# PBinfo #3376 – asciimat – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Se dă un şir de caractere S format din litere mari şi mici ale alfabetului englez, spaţii şi caracterul ⌂ ce are codul ASCII 127. Fiecare caracter al lui S se codifică printr-o succesiune de 1 şi 0 ce reprezintă codul ASCII al caracterului în baza 2. Codul începe cu cifra 1, astfel pentru caracterul A codificarea este 1000001. Un cuvânt poate fi format din litere şi caracterul ⌂. Se consideră matricea M formată din cuvintele șirului S codificate şi memorate pe câte o linie în ordinea în care se găsesc acestea în propoziție.

Cerința
Scrieţi un program care, cunoscând S şi K, rezolvă următoarele două cerinţe:
1.	determină L, latura celui mai mare pătrat din matricea M ce conține doar valori de 1;
2.	determină NR, câte pătrate de latura K cu toate elementele egale cu 1 există în matricea M. 

Date de intrare
Fișierul de intrare asciimat.in conţine pe prima linie cerinţa care trebuie să fie rezolvată (1 sau 2). Pe a doua linie se află șirul S, iar pe a treia linie se află valoarea K, având semnificaţia din enunţ.

Date de ieșire
Dacă cerinţa este 1, fişierul de ieşire asciimat.out va conţine o singură linie pe care va fi scris L, latura celui mai mare pătrat din matricea M ce conține doar valori de 1.
Dacă cerinţa este 2, fişierul de ieşire asciimat.out va conţine o singură linie pe care va fi scris NR, câte pătrate de latura K cu toate elementele egale cu 1 există în matricea M.

Restricții și precizări

şirul S are cel mult 3000 de caractere
3 ≤ K ≤ 50
lungimea unui cuvânt nu depăşeşte 100 de caractere
fiecare cuvânt este codificat pe o singură linie
fiecare literă este codificată pe 7 biţi
liniile conţin concatenarea codurilor ASCII ale literelor unui cuvânt, astfel restul valorilor rămase libere din cadrul unei linii vor avea valoarea 0.
numărul de cuvinte din şir nu depăşeşte valoarea 300.

Exemplul 1:
asciimat.in

1
Ana are mere
3
asciimat.out

3
Exemplul 2:
asciimat.in

2
Ana are mere
2
asciimat.out

7
Explicație
Matricea obţinută este:

1000001110111011000010000000
1100001111001011001010000000
1101101110010111100101100101

La poziția (1,8) în matrice este colţul stânga-sus al unui pătrat de latura 3 cu toate elementele egale cu 1.
Există 7 pătrate de latură 2 cu toate elementele egale cu 1.

## Cod sursă C++

```cpp
#include <fstream>
#include <iostream>
#include <cstring>
#define DIM 3001
#define LCUV 100
#define NCUV 300
using namespace std;
ifstream fin("asciimat.in");
ofstream fout("asciimat.out");
char s[DIM],*p;//fiecare caracter codificat ocupa 7 elemente
int m[NCUV+5][LCUV*7+5],cer,k,nr,i,j,t,x,poz,l,c,d1=1,d2=1;//d1,d2 dimensiunile matricei m
int main()
{
    fin>>cer;
    fin.get();
    fin.getline(s,DIM);
    fin>>k;
    //construire matrice
    p=strtok(s," ");
    while(p)
    {
        j=1;
        for(t=0; p[t]; t++)
        {
            x=p[t];
            poz=0;
            while(x)
            {
                m[d1][j+(7-poz)]=x%2;
                poz++;
                x=x/2;
            }
            j=j+7;//urmatorul caracter
        }
        if(j>d2)
            d2=j;//d2 primea j-7
        p=strtok(0," ");
        d1++;
    }
    d2++;//d2 il consider cu 1 mai mare decat numarul de coloane
    for(i=1; i<d1; i++)
        for(j=1; j<d2; j++)
            m[i][j]=m[i][j]+m[i-1][j]+m[i][j-1]-m[i-1][j-1];
    if(cer==1)//cerinta problemei 1
    {
        k=max(d1,d2);
        for(; k>2; k--)
            for(i=1; i<=d1-k; i++)
                for(j=1; j<=d2-k; j++)
                {
                    l=i+k-1;
                    c=j+k-1;
                    if(m[l][c]-m[i-1][c]-m[l][j-1]+m[i-1][j-1]==k*k)
                    {
                        fout<<k;
                        return 0;
                    }
                }
    }
    if(cer==2)//cerinta problemei 2
    {
        for(i=1; i<=d1-k; i++)
            for(j=1; j<=d2-k; j++)
            {
                l=i+k-1;
                c=j+k-1;
                if(m[l][c]-m[i-1][c]-m[l][j-1]+m[i-1][j-1]==k*k)
                    nr++;
            }
        fout<<nr;
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3376)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3376/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3376/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
