#include <iostream>
#include <vector>
using namespace std;
// Funkcja rekurencyjna rysująca zbiór Cantora
void cantor(vector<string>& canvas, int level, int left, int right, int height) {
if (level == 0) {
// rysujemy odcinek
for (int i = left; i <= right; i++) {
canvas[height][i] = '#';
}
return;
}
int third = (right - left + 1) / 3;
// Lewa część
cantor(canvas, level - 1, left, left + third - 1, height + 1);
// Prawa część
cantor(canvas, level - 1, right - third + 1, right, height + 1);
}
int main() {
int n;
cout << "Podaj stopien zbioru Cantora (np. 3 lub max 6): ";
cin >> n;
if (n < 0 || n > 6) {
cout << "Stopien musi byc z zakresu 0-6!" << endl;
return 1;
}
int width = 1;
for (int i = 0; i < n; i++) {
width *= 3; // 3^n
}
vector<string> canvas(n + 1, string(width, ' '));
// Rysujemy pierwszy (pełny) odcinek
for (int i = 0; i < width; i++) {
canvas[0][i] = '#';
}
// Rekurencja
cantor(canvas, n, 0, width - 1, 0);
// Wyświetlanie
for (const auto& row : canvas) {
cout << row << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gRnVua2NqYSByZWt1cmVuY3lqbmEgcnlzdWrEhWNhIHpiacOzciBDYW50b3JhCnZvaWQgY2FudG9yKHZlY3RvcjxzdHJpbmc+JiBjYW52YXMsIGludCBsZXZlbCwgaW50IGxlZnQsIGludCByaWdodCwgaW50IGhlaWdodCkgewogICAgaWYgKGxldmVsID09IDApIHsKICAgICAgICAvLyByeXN1amVteSBvZGNpbmVrCiAgICAgICAgZm9yIChpbnQgaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKykgewogICAgICAgICAgICBjYW52YXNbaGVpZ2h0XVtpXSA9ICcjJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGludCB0aGlyZCA9IChyaWdodCAtIGxlZnQgKyAxKSAvIDM7CgogICAgLy8gTGV3YSBjesSZxZvEhwogICAgY2FudG9yKGNhbnZhcywgbGV2ZWwgLSAxLCBsZWZ0LCBsZWZ0ICsgdGhpcmQgLSAxLCBoZWlnaHQgKyAxKTsKCiAgICAvLyBQcmF3YSBjesSZxZvEhwogICAgY2FudG9yKGNhbnZhcywgbGV2ZWwgLSAxLCByaWdodCAtIHRoaXJkICsgMSwgcmlnaHQsIGhlaWdodCArIDEpOwp9CgppbnQgbWFpbigpIHsKICAgIGludCBuOwogICAgY291dCA8PCAiUG9kYWogc3RvcGllbiB6YmlvcnUgQ2FudG9yYSAobnAuIDMgbHViIG1heCA2KTogIjsKICAgIGNpbiA+PiBuOwoKICAgIGlmIChuIDwgMCB8fCBuID4gNikgewogICAgICAgIGNvdXQgPDwgIlN0b3BpZW4gbXVzaSBieWMgeiB6YWtyZXN1IDAtNiEiIDw8IGVuZGw7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaW50IHdpZHRoID0gMTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgd2lkdGggKj0gMzsgIC8vIDNebgogICAgfQoKICAgIHZlY3RvcjxzdHJpbmc+IGNhbnZhcyhuICsgMSwgc3RyaW5nKHdpZHRoLCAnICcpKTsKCiAgICAvLyBSeXN1amVteSBwaWVyd3N6eSAocGXFgm55KSBvZGNpbmVrCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKICAgICAgICBjYW52YXNbMF1baV0gPSAnIyc7CiAgICB9CgogICAgLy8gUmVrdXJlbmNqYQogICAgY2FudG9yKGNhbnZhcywgbiwgMCwgd2lkdGggLSAxLCAwKTsKCiAgICAvLyBXecWbd2lldGxhbmllCiAgICBmb3IgKGNvbnN0IGF1dG8mIHJvdyA6IGNhbnZhcykgewogICAgICAgIGNvdXQgPDwgcm93IDw8IGVuZGw7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=