Sunday, July 10, 2011

Solución al Problema 110105 - Editor Grafico [http://www.programming-challenges.com]

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;
}