#include <iostream>
#include <cmath>
#include <string>
#include <vector>
using namespace std;
// Funkcja generująca tekstową reprezentację zbioru Cantora
void rysujCantora(int x, int y, int dlugosc, vector<string>& tablica) {
if (dlugosc < 1) return;
// Wypełniamy aktualny odcinek znakami '#' w odpowiednim rzędzie (y)
for (int i = x; i < x + dlugosc; i++) {
tablica[y][i] = '#';
}
// Jeśli możemy zejść głębiej, dzielimy odcinek na 3 części
// i wywołujemy funkcję dla lewej i prawej strony (środek zostaje pusty)
if (y + 1 < tablica.size()) {
int nowaDlugosc = dlugosc / 3;
rysujCantora(x, y + 1, nowaDlugosc, tablica); // Lewa strona
rysujCantora(x + 2 * nowaDlugosc, y + 1, nowaDlugosc, tablica); // Prawa strona
}
}
int main() {
int n;
cout << "Podaj rzad zbioru Cantora (n) do narysowania: ";
cin >> n;
if (n < 0) return 1;
// Obliczenia matematyczne
long long liczba_odcinkow = pow(2, n);
long long mianownik = pow(3, n);
// Przygotowanie tablicy do rysowania (szerokość musi być potęgą 3)
int szerokosc = pow(3, n);
vector<string> wizualizacja(n + 1, string(szerokosc, ' '));
rysujCantora(0, 0, szerokosc, wizualizacja);
// Wyświetlanie wyników
cout << "\nLiczba odcinkow: " << liczba_odcinkow << endl;
cout << "Dlugosc jednego odcinka: 1/" << mianownik << "\n" << endl;
// Wyświetlanie rysunku
for (int i = 0; i <= n; i++) {
cout << "n=" << i << ": " << wizualizacja[i] << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gRnVua2NqYSBnZW5lcnVqxIVjYSB0ZWtzdG93xIUgcmVwcmV6ZW50YWNqxJkgemJpb3J1IENhbnRvcmEKdm9pZCByeXN1akNhbnRvcmEoaW50IHgsIGludCB5LCBpbnQgZGx1Z29zYywgdmVjdG9yPHN0cmluZz4mIHRhYmxpY2EpIHsKICAgIGlmIChkbHVnb3NjIDwgMSkgcmV0dXJuOwoKICAgIC8vIFd5cGXFgm5pYW15IGFrdHVhbG55IG9kY2luZWsgem5ha2FtaSAnIycgdyBvZHBvd2llZG5pbSByesSZZHppZSAoeSkKICAgIGZvciAoaW50IGkgPSB4OyBpIDwgeCArIGRsdWdvc2M7IGkrKykgewogICAgICAgIHRhYmxpY2FbeV1baV0gPSAnIyc7CiAgICB9CgogICAgLy8gSmXFm2xpIG1vxbxlbXkgemVqxZvEhyBnxYLEmWJpZWosIGR6aWVsaW15IG9kY2luZWsgbmEgMyBjesSZxZtjaQogICAgLy8gaSB3eXdvxYJ1amVteSBmdW5rY2rEmSBkbGEgbGV3ZWogaSBwcmF3ZWogc3Ryb255ICjFm3JvZGVrIHpvc3RhamUgcHVzdHkpCiAgICBpZiAoeSArIDEgPCB0YWJsaWNhLnNpemUoKSkgewogICAgICAgIGludCBub3dhRGx1Z29zYyA9IGRsdWdvc2MgLyAzOwogICAgICAgIHJ5c3VqQ2FudG9yYSh4LCB5ICsgMSwgbm93YURsdWdvc2MsIHRhYmxpY2EpOyAgICAgICAgICAgICAgICAvLyBMZXdhIHN0cm9uYQogICAgICAgIHJ5c3VqQ2FudG9yYSh4ICsgMiAqIG5vd2FEbHVnb3NjLCB5ICsgMSwgbm93YURsdWdvc2MsIHRhYmxpY2EpOyAvLyBQcmF3YSBzdHJvbmEKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbjsKICAgIGNvdXQgPDwgIlBvZGFqIHJ6YWQgemJpb3J1IENhbnRvcmEgKG4pIGRvIG5hcnlzb3dhbmlhOiAiOwogICAgY2luID4+IG47CgogICAgaWYgKG4gPCAwKSByZXR1cm4gMTsKCiAgICAvLyBPYmxpY3plbmlhIG1hdGVtYXR5Y3puZQogICAgbG9uZyBsb25nIGxpY3piYV9vZGNpbmtvdyA9IHBvdygyLCBuKTsKICAgIGxvbmcgbG9uZyBtaWFub3duaWsgPSBwb3coMywgbik7CgogICAgLy8gUHJ6eWdvdG93YW5pZSB0YWJsaWN5IGRvIHJ5c293YW5pYSAoc3plcm9rb8WbxIcgbXVzaSBiecSHIHBvdMSZZ8SFIDMpCiAgICBpbnQgc3plcm9rb3NjID0gcG93KDMsIG4pOwogICAgdmVjdG9yPHN0cmluZz4gd2l6dWFsaXphY2phKG4gKyAxLCBzdHJpbmcoc3plcm9rb3NjLCAnICcpKTsKCiAgICByeXN1akNhbnRvcmEoMCwgMCwgc3plcm9rb3NjLCB3aXp1YWxpemFjamEpOwoKICAgIC8vIFd5xZt3aWV0bGFuaWUgd3luaWvDs3cKICAgIGNvdXQgPDwgIlxuTGljemJhIG9kY2lua293OiAiIDw8IGxpY3piYV9vZGNpbmtvdyA8PCBlbmRsOwogICAgY291dCA8PCAiRGx1Z29zYyBqZWRuZWdvIG9kY2lua2E6IDEvIiA8PCBtaWFub3duaWsgPDwgIlxuIiA8PCBlbmRsOwoKICAgIC8vIFd5xZt3aWV0bGFuaWUgcnlzdW5rdQogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgY291dCA8PCAibj0iIDw8IGkgPDwgIjogIiA8PCB3aXp1YWxpemFjamFbaV0gPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==