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 mult3000
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
.
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 asciimat:
#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;
}
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 #3376 asciimat
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3376 asciimat 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!