#include <iostream>
#include <cmath>
using namespace std;

const int WYSOKOSC = 32;               // Wysokość trójkąta (musi być potęgą 2)
const int SZEROKOSC = 2 * WYSOKOSC - 1; // Szerokość trójkąta
char kanwa[WYSOKOSC][SZEROKOSC];       // Statyczna 2D tablica do rysowania

// Funkcja inicjalizująca kanwę spacjami
void inicjalizujKanwe() 
{
    for (int i = 0; i < WYSOKOSC; i++) 
	{
        for (int j = 0; j < SZEROKOSC; j++) 
		{
            kanwa[i][j] = ' ';
        }
    }
}

// Rekurencyjna funkcja do rysowania trójkąta Sierpińskiego
void trojkatSierpinskiego(int x, int y, int rozmiar) 
	{
    // Warunek bazowy: jeśli rozmiar to 1, umieść gwiazdkę w pozycji (x, y)
    if (rozmiar == 1) 
	{
        kanwa[y][x] = '*';
    } else 
	{
        int nowyRozmiar = rozmiar / 2;
        
        // Rysuj trzy mniejsze trójkąty
        trojkatSierpinskiego(x, y, nowyRozmiar);                    // Górny trójkąt
        trojkatSierpinskiego(x - nowyRozmiar, y + nowyRozmiar, nowyRozmiar); // Dolny lewy trójkąt
        trojkatSierpinskiego(x + nowyRozmiar, y + nowyRozmiar, nowyRozmiar); // Dolny prawy trójkąt
    }
}

// Funkcja do wyświetlania kanwy
void wyswietlKanwe() {
    for (int i = 0; i < WYSOKOSC; i++) 
	{
        for (int j = 0; j < SZEROKOSC; j++) 
		{
            cout << kanwa[i][j];
        }
        cout << endl;
    }
}

int main() 
{
    inicjalizujKanwe();                           // Inicjalizacja kanwy
    trojkatSierpinskiego(SZEROKOSC / 2, 0, WYSOKOSC); // Rysowanie trójkąta Sierpińskiego
    wyswietlKanwe();                              // Wyświetlanie wyniku
    return 0;
}
