Solución al Problema 110105 - Editor Grafico [http://www.programming-challenges.com]
/*
* 110105 - Editor Grafico [http://www.programming-challenges.com]
* Autor: BreakDark
* Version 5.2_cpp beta
*/
// ACEPTADO!!! xD
#include <iostream>
using namespace std;
// Variables Globales
int colM,filN; // Tamaño de la imagen
/* Procedimiento recursivo que pinta y busca en la 4 direcciones si es el color buscado
sigue la recursividad hasta encontra un color distinto*/
void llenaRegion(int fil, int col, char colorAbuscar, char colorAPintar, char imagenTemp[250][250]){
// pintamos el pixel y buscamos los lados comunes
imagenTemp[fil][col]=colorAPintar;
// buscamos arriba
if((fil>0)&&(imagenTemp[fil-1][col]==colorAbuscar))
llenaRegion(fil-1,col,colorAbuscar,colorAPintar,imagenTemp);
// buscamos abajo
if((fil<filN-1)&&(imagenTemp[fil+1][col]==colorAbuscar))
llenaRegion(fil+1,col,colorAbuscar,colorAPintar,imagenTemp);
// buscamos a la izquierda
if((col>0)&&(imagenTemp[fil][col-1]==colorAbuscar))
llenaRegion(fil,col-1,colorAbuscar,colorAPintar,imagenTemp);
// buscamos a la derecha
if((col<colM-1)&&(imagenTemp[fil][col+1]==colorAbuscar))
llenaRegion(fil,col+1,colorAbuscar,colorAPintar,imagenTemp);
}
int main()
{
char comando; // para leer los comandos
char imagen[250][250]; // para guardar la imagen
int i,j; // para los bucles
int X,Y,Y1,Y2,X1,X2,temp;
char C,colorAbuscar; // para el color
char nombre[13]; // nombres en DOS ********.*** mas el espacio
// AQUI INICIA EL PROGRAMA
while(cin>>comando){
if(comando=='X')
return 0; /* Finaliza la sesion. */
switch(comando){
case 'I':
// Crea una imagen vacia de M columnas * N filas
cin>>colM>>filN;
for(i=0;i<filN;i++)
for(j=0;j<colM;j++)
imagen[i][j]='O';
break;
case 'C':
// limpia la imagen
for(i=0;i<filN;i++)
for(j=0;j<colM;j++)
imagen[i][j]='O';
break;
case 'L':
// Colorea el pixel (X,Y) con el color C
cin>>X>>Y>>C;
imagen[Y-1][X-1]=C;
break;
case 'V':
/* Dibuja un segmento vertical de color C en la columna X,
entre las lineas Y1 y Y2, ambos incluidos */
cin>>X>>Y1>>Y2>>C;
if(Y1>Y2){
temp=Y1;
Y1=Y2;
Y2=temp;
}
for(i=Y1-1;i<Y2;i++)
imagen[i][X-1]=C;
break;
case 'H':
/* Dibuja un segmento horizontal de color C en la linea Y,
entre las columnas X1 y X2, ambos incluidos */
cin>>X1>>X2>>Y>>C;
if(X1>X2){
temp=X1;
X1=X2;
X2=temp;
}
for(i=X1-1;i<X2;i++)
imagen[Y-1][i]=C;
break;
case 'K':
/* Dibuja un rectangulo relleno de color C, donde
(X1,Y1) es la esquina superior izquierda y (X2,Y2)
corresponde a la inferior derecha. */
cin>>X1>>Y1>>X2>>Y2>>C;
for(i=Y1-1;i<Y2;i++)
for(j=X1-1;j<X2;j++)
imagen[i][j]=C;
break;
case 'F':
/* Rellena el area R con el color C, donde R se define
de la siguiente manera: el pìxel (X,Y) pertenece a
R, cualquier otro pixel que sea del mismo color que el
pixel (X,Y) y comparta un lado comun con cualquier
otro pixel de R, tambien pertenece a la region. */
cin>>X>>Y>>C;
colorAbuscar=imagen[Y-1][X-1];
if(C!=colorAbuscar){
llenaRegion(Y-1,X-1,colorAbuscar,C,imagen);
}
break;
case 'S':
/* Describe el nombre del archivo, seguido por el contenido
actual de la imagen. */
cin>>nombre;
cout<<nombre<<endl;
for(i=0;i<filN;i++){
for(j=0;j<colM;j++)
cout<<imagen[i][j];
cout<<endl;
}
break;
default:
break;
}
}
return 0;
}