Rezolvare completă PbInfo #2082 Sierpinski

Cerința

Se dă un număr natural n. Să se genereze o matrice pătratică de ordinul 3n, cu elemente din mulțimea {0, 1}, după modelul covorului lui Sierpinski.

Date de intrare

Fișierul de intrare sierpinski.in conține pe prima linie numărul n.

Date de ieșire

Fișierul de ieșire sierpinski.out va conține pe primele 3n linii câte 3n cifre binare, reprezentând elementele matricei.

Restricții și precizări

  • 1 ≤ n ≤ 6
  • Atenție la limita de memorie!

Exemplu

sierpinski.in

2

sierpinski.out

0 0 0 0 0 0 0 0 0 
0 1 0 0 1 0 0 1 0 
0 0 0 0 0 0 0 0 0 
0 0 0 1 1 1 0 0 0 
0 1 0 1 1 1 0 1 0 
0 0 0 1 1 1 0 0 0 
0 0 0 0 0 0 0 0 0 
0 1 0 0 1 0 0 1 0 
0 0 0 0 0 0 0 0 0 

Explicație

Covorul lui Sierpinski

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 Sierpinski:

#include <bits/stdc++.h>
#define DMAX 730

using namespace std;

ifstream fin("sierpinski.in");
ofstream fout("sierpinski.out");

vector< vector<bool> > a(DMAX);
int n, w;

/// Functia care initializeaza "matricea":
void init() {
    for (int i = 1; i < DMAX; i++)
        a[i].resize(DMAX);
}

/// Functia recursiva:
void draw(int x, int y, int w) {
    int pe3 = w / 3; // "Umplem" cu 1 patratul din mijloc:
    for (int i = x + pe3; i <= x + 2 * pe3 - 1; i++)
        for (int j = y + pe3; j <= y + 2 * pe3 - 1; j++)
            a[i][j] = true;

    // Dupa ce am format patrate de lungime minima (1), ne oprim:
    if (pe3 == 1)
        return;

    // Umplem cele 8 patrate:
    draw(x          , y          , pe3);
    draw(x          , y +     pe3, pe3);
    draw(x          , y + 2 * pe3, pe3);
    draw(x +     pe3, y          , pe3);
    draw(x +     pe3, y + 2 * pe3, pe3);
    draw(x + 2 * pe3, y          , pe3);
    draw(x + 2 * pe3, y +     pe3, pe3);
    draw(x + 2 * pe3, y + 2 * pe3, pe3);
}

int main() {
    fin >> n;
    w = pow(3, n);
    init();

    draw(1, 1, w);
    for (int i = 1; i <= w; i++) {
        for (int j = 1; j <= w; j++)
            fout << a[i][j] << ' ';
        fout << '\n';
    }

    fout.close();
    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 #2082 Sierpinski

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2082 Sierpinski 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!