mis fichas

mail@pastecode.io avatar
unknown
plain_text
4 years ago
3.0 kB
31
Indexable
Never
Enunciado:

Al volver se su laaaaaarga travesía para destruir el anillo, la vida de Sam se volvió un poco aburrida. No es que este disconforme con la tranquilidad que consiguió, solo le gustaría tener algunos hobbies. Probó zumba, yoga, runnnig, pero nada lo conformaba. Pippin le recomendó que pruebe resolviendo rompecabezas, que lo iban a entretener. Empezó con uno de elefantes y le encantó el desafío, hoy se encuentra resolviendo uno con casitas de colores y está un poco trabado, porque puso todas las fichas pero como que no le cierra. El rompecabezas se puede ver como una matriz, donde cada celda es una ficha con la siguiente estructura: ```c typedef struct ficha { int id_ficha; int id_ficha_derecha; int id_ficha_izquierda; int id_ficha_arriba; int id_ficha_abajo; } ficha_t; ``` Si una ficha está en uno de los bordes, tendrá un **-1** en los campos correspondientes. 1. Determinar cuántas fichas no tienen ninguna de sus fichas vecinas (derecha, izquierda, arriba y abajo) correctamente puestas.

Solución enviada:

#define DIMENSION_MAX 100

/* pre: el 0,0 del tablero es izq arriba; esta cargado correctamente; recibe datos validos
 * post: devuelve los vecinos correctos que tiene una ficha en cierta poscicion
 */
int vecinos_correctos( ficha_t tablero[DIMENSION_MAX][DIMENSION_MAX], int filas, int columnas,
    int fila, int columna ){
    
    int vecinos = 0;
    
    ficha_t ficha = tablero[fila, columna];
    int id_ficha_aux, fil_aux, col_aux;
    
    // Derecha
    fil_aux = fila; col_aux = columna+1;
    id_ficha_aux = (col_aux < columnas )? tablero[fil_aux][col_aux].id_ficha :-1;
    if( id_ficha_aux == ficha.id_ficha_derecha )
        vecinos++;
        
    
    // Izquierda
    fil_aux = fila; col_aux = columna-1;
    id_ficha_aux = (col_aux >= 0 )? tablero[fil_aux][col_aux].id_ficha :-1;
    if( id_ficha_aux == ficha.id_ficha_izquierda )
        vecinos++;
        
    
    // Arriba
    fil_aux = fila-1; col_aux = columna;
    id_ficha_aux = (fil_aux >=0 )? tablero[fil_aux][col_aux].id_ficha :-1;
    if( id_ficha_aux == ficha.id_ficha_arriba )
        vecinos++;
        
    
    // Abajo
    fil_aux = fila+1; col_aux = columna;
    id_ficha_aux = (fil_aux < filas )? tablero[fil_aux][col_aux].id_ficha :-1;
    if( id_ficha_aux == ficha.id_ficha_abajo )
        vecinos++;
        
        
    return vecinos;
}
// Determina cuantas fichas en un tablero ( rompecabezas ) no tienen ninguna de sus vecinas
// pre: el 0,0 del tablero es izq arriba
int fichas_sin_vecinas( ficha_t tablero[DIMENSION_MAX][DIMENSION_MAX], int filas, int columnas ){
    
    int fichas_sin_vecinas = 0;
    
    for( int i = 0 ; i        for( int j = 0 ; j            
            int vecinos = vecinos_correctos( tablero,filas,columnas,i,j );
            
            if(!vecinos)
                fichas_sin_vecinas++;
            
        }
    }
    
    return fichas_sin_vecinas;
}