No se si es "eficiente" pero esta bien estructurado (a mejorar: no usar variables globales)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct matrix {
int rows,cols;
char **cells;
};
matrix m;
void make_board(int h,char c=' ');
void put_block(int x,int y, int len, char c = '*');
void triangle(int x,int y, int h, char c = '*');
void render(void);
void release(void);
int main(void) {
int h = 4;
make_board(h);
triangle(h*2-1,0,h);
triangle(h-1,h,h);
triangle(h*3-1,h,h);
render();
release();
return 0;
}
void make_board(int h, char c=' ')
{
int i,j;
m.cols = h*4-1; m.rows = h*2;
m.
cells = (char**) malloc(m.
cols* sizeof(char*)); for (i=0; i<m.cols; i++)
m.
cells[i
] = (char*) malloc(m.
rows * sizeof(char));
for (i=0; i<m.rows; i++)
for (j=0; j<m.cols; j++)
m.cells[i][j]= c;
}
void release
(void){ free(m.
cells); }
void render(void)
{
int i,j;
for (i=0; i<m.rows; i++){ // fila
for (j=0; j<m.cols; j++) // columna
cout << m.cells[i][j];
cout << endl;
}
}
void put_block(int x,int y, int len, char c = '*'){
int ix, iy=y;
for (ix=x; ix<x+len; ix++){
m.cells[iy][ix] = c;
}
}
void triangle(int x,int y, int h, char c = '*')
{
int ix=x,iy,len=1;
for (iy=y; iy<y+h; iy++){
put_block(ix,iy,len,c);
ix--;
len+=2;
}
}
UPDATE: hay una mini-libreria que he hecho y sirve para hacer eso mucho mas facil aun,
aqui