Rezolvare completă PbInfo #3376 asciimat

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.

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 Adresa de email.

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!