CC30A Algoritmos y estructuras de datos

Clase Auxiliar 30/03/2001

Problema 1:
 
 

Problema 2:
 

Problema 3: Pintado de superficies irregulares

Mediante un método recursivo diseñe un método recursivo que permita colorear una superficie irregular.

Suponga que la superficie está compuesta por sólo una región.
Suponga que los puntos se definen como par (x,y).
Suponga que tienen la función frontera(x,y), que retorna verdadero si (x,y) está en la frontera y falso sino.
Suponga que conoce un punto al interior de la superfice.

Como referencia considere la figura.
 

Para pintar la figura, se comienza en el punto conocido y primero se prueba si se puede pintar arriba, luego a la derecha, abajo y por último a la izquierda.

Para indicar que un punto fue pintado se utiliza pinta(x,y), que se encarga de marcar (x,y) como un punto pintado.

Para evitar pintar dos veces un punto, se utiliza la función pintado(x,y) que retorna verdadero si (x,y) está pintado y falso si no.

La condición de borde se tiene cuando se encuentra un punto en la frontera o que ya está pintado.

/* La figura tiene el borde definido */
Figura es una matriz de MaxX x MaxY;

pintar (x, y) {
    /* condición de salida */
    if (fontera(x,y) o pintado(x,y)) {
        return;
    }
    /* acción */
    else {
        pinta(x,y);
    }
    /* llamadas recursivas hacia arriba, derecha, abajo e izquierda */
    pintar(x, y+1);
    pintar(x+1, y);
    pintar(x, y-1);
    pintar(x-1, y);
    return;
}

/* Funciones auxiliares */
frontera (x,y){
    if (Figura[x,y] = FRONTERA){
        return verdadero;
    }
    else {
        return falso;
    }
}

pintado(x,y){
    if (Figura[x,y] = PINTADO){
        return verdadero;
    }
    else {
        return falso;
    }
}

pinta(x,y){
    Figura[x,y] <- PINTADO);
}

Extensiones:

Contar los puntos a pintar:

Utilizando variables globales:

int contador <- 0;

pintar (x, y) {
    /* condición de salida */
    if (fontera(x,y) o pintado(x,y)) {
        return;
    }
    /* acción */
    else {
        pinta(x,y);
        Pintados++;
    }
    /* llamadas recursivas hacia arriba, derecha, abajo e izquierda */
    pintar(x, y+1);
    pintar(x+1, y);
    pintar(x, y-1);
    pintar(x-1, y);
    return;
}

Utilizando variables locales:

pintar (x, y) {
    int contador <- 0;
    /* condición de salida */
    if (fontera(x,y) o pintado(x,y)) {
        return contador /* == 0 */;
    }
    /* acción */
    else {
        pinta(x,y);
        contador++;
    }
    /* llamadas recursivas hacia arriba, derecha, abajo e izquierda */
    contador <- contador + pintar(x, y+1);
    contador <- contador + pintar(x+1, y);
    contador <- contador + pintar(x, y-1);
    contador <- contador + pintar(x-1, y);
    return contador;
}

Problema 4: Sumar los elementos de un arreglo