PROBLEME
Une image qui a une apparence similaire quelle-que soit l'échelle à laquelle on l'observe est appelée une fractale (il y a d'autres types de fractales).
Un exemple simple de fractale est le triangle de Sierpinski, dont voici une représentation :

Une telle image peut être réalisée en quelques minutes avec n'importe-quel logiciel de dessin. On commence par former un triangle de trois pixels. On en fait ensuite trois copies que l'on utilise pour former un plus grand triangle, et on recommence l'opération avec ce nouveau triangle, et ainsi de suite, jusqu'à obtenir une figure de la taille souhaitée.
Voici une vue zoomée des trois premières étapes de l'opération :

Les dimensions de la figure étant multipliées par 2 à chaque nouvelle étape, le côté de la figure finale est une puissance de 2.
Ecrivez un programme qui lit un nombre sur l'entrée standard (une puissance de 2), et affiche un triangle de Sierpinski de la taille indiquée.
Les pixels noirs doivent être affichés sous la forme de caractères '#', et les pixels blancs sous la forme d'espaces. N'affichez pas d'espaces à la fin des lignes, lorsqu'il n'y a plus de caractères '#' sur la ligne.
Conseil : créez l'image dans un tableau avec une fonction récursive, avant d'afficher le contenu de ce tableau.
Votre programme doit impérativement être basé sur une fonction récursive, et non sur des boucles..
CONTRAINTES
1 <= N <= 64, où N est le côté de la figure.
ENTREE
Un entier : la taille du côté de la figure.
SORTIE
Le triangle de Sierpinski de la taille fournie en entrée.
CODE SOURCE
Code: C++ #include <cstdio> char image[64][64]; void triangle(unsigned int x, unsigned int y, unsigned int n) { if (n == 0) return; if (n == 1) { image[x][y] = '#'; return; } triangle(x, y, n>>1); triangle(x + (n>>1), y, n>>1); triangle(x, y + (n>>1), n>>1); } int main(int argc, char* argv[]) { unsigned int N; scanf_s("%u", &N); for (unsigned int i=0; i<N; i++) for (unsigned int j=0; j<N; j++) image[i][j] = ' '; triangle(0, 0, N); for (unsigned int i=0; i<N; i++) { unsigned int n = N; for (unsigned int j=N-1; j>=0; --j) { if (image[i][j] == ' ') n--; else break; } for (unsigned int j=0; j<n; j++) putchar(image[i][j]); putchar('\n'); } return 0; }
|