Cerința
Considerăm codificarea binară a caracterelor, în care fiecărui simbol îi revine reprezentarea pe 8 biţi a codului său ASCII. De exemplu, caracterului 'A'
, având codul ASCII 65
, îi va corespunde reprezentarea binară 01000001
. Astfel, un cuvânt C
poate fi reprezentat binar, sub forma unui tablou bidimensional, în care fiecare linie i
a tabloului reprezintă codificarea binară a literei de pe poziţia i
din C
, tabloul având în final atâtea linii câte litere are cuvântul, şi 8
coloane.
Scrieţi un program care, citind de la tastatură cuvântul C
, construieşte în memorie matricea reprezentării binare, şi afişează pe ecran dimensiunea celei mai mari submatrici pătratice conţinând elemente având toate aceeaşi valoare (fie 0
, fie 1
).
Date de intrare
Programul citește de la tastatură cuvântul C
Date de ieșire
Programul va afișa pe ecran dimensiunea maximă cerută.
Restricții și precizări
- cuvântul are cel mult
100
de caractere, litere mari şi/sau mici ale alfabetului englez
Exemplu
Intrare
IDEEA
Ieșire
3
Explicație
Pentru şirul de caractere IDEEA
, matricea corespunzătoare va fi \(\scriptsize\begin{bmatrix}
0&1&0&0&1&0&0&1\\
0&1&\underline{0}&\underline{0}&\underline{0}&1&0&0 \\
0&1&\underline{0}&\underline{0}&\underline{0}&1&0&1 \\
0&1&\underline{0}&\underline{0}&\underline{0}&1&0&1 \\
0&1&0&0&0&0&0&1
\end{bmatrix}\). Submatricea pătratică de dimensiune maximă este cea cu elementele subliniate.
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 dim_maxim_binar:
// o posibila solutie de 100p pentru problema dim_maxim_binar #1459 @pbinfo.ro
// ideile prezentate pot fi imbunatatite
// compilat cu Code::Blocks 13.12
#include <iostream> // std::cin, std::cout
#include <cstring> // strlen
using namespace std;
int matriceBinara[105][10], numarLinii, numarColoane;
char cuvant[105];
//-------------------------------------------------------------------------------------------------------
// functie care returneaza, prin intermediul parametrului vect (vector de numere intregi), codificarea binara a
// caracterului transmis prin intermediul parametrului caracter (de tip char)
void charToInt(char caracter, int vect[]) {
int ordinAscii = (int) caracter;
for(int i = 8; i >= 1; i--) {
vect[i] = ordinAscii % 2;
ordinAscii /= 2;
}
}
//-------------------------------------------------------------------------------------------------------
// transforma matriceBinara (declarata global) in reprezentarea binara a cuvantului citit de la tastatura
void transformareMatrice()
{
int lungime = strlen(cuvant), vect_local[10];
for(int i = 1; i <= lungime; i++) {
charToInt(cuvant[i-1], vect_local);
for(int j = 1; j <= 8; j++)
matriceBinara[i][j] = vect_local[j];
}
// stabilirea dimensiunilor
numarLinii = lungime; // lungimea cuvantului
numarColoane = 8;
}
//-------------------------------------------------------------------------------------------------------
// verifica daca submatricea patratica, delimitata de (i_start, j_start) (colt stanga sus) si
// (i_final, j_final) (colt dreapta jos) are toate elementele egale (0 sau 1)
bool verificareSubmatrice(int i_start, int i_final, int j_start, int j_final)
{
for(int i = i_start; i <= i_final; i++)
for(int j = j_start; j <= j_final; j++)
if(matriceBinara[i][j] != matriceBinara[i_start][j_start])
return false;
return true;
}
//-------------------------------------------------------------------------------------------------------
// subprogram care returneaza dimensiunea celei mai mari submatrici patratice avand toate elementele egale
int secventaMaxima()
{
int secventa_max = 1;
// parcurgem matricea binara, fara ultima linie si ultima coloana
for(int i = 1; i < numarLinii; i++)
for(int j = 1; j < numarColoane; j++)
// parcurgem toate submatricile patratice posibile, pornind de la pozitia (i, j)
for(int _i = i + 1, _j = j + 1; _i <= numarLinii && _j <= numarColoane; _i++, _j++)
if(verificareSubmatrice(i, _i, j, _j)) { // submatricea are toate elementele egale
if(_i - i + 1 > secventa_max)
secventa_max = _i - i + 1;
}
else
break; // oprim for-ul, deoarece nu mai are rost sa continuam cu el
return secventa_max;
}
//-------------------------------------------------------------------------------------------------------
// Programul principal
int main(void)
{
cin >> cuvant;
transformareMatrice();
cout << secventaMaxima();
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 #1459 dim_maxim_binar
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1459 dim_maxim_binar 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!