Documente Academic
Documente Profesional
Documente Cultură
25 de noviembre de 2013
Notas:
1. Al finalizar, enviar por e-mail los archivos fuente de cada
ejercicio con nombre APELLIDO_NOMBRE_Ejer_N.c a
icom@ib.cnea.gov.ar
2. Uso de prcticos: se pueden utilizar los trabajos prcticos
propios realizados.
3. Uso de Internet: solo para la consulta de referencias de
funciones de C.
Problema 1. Laberinto
La siguiente estructura de datos permite representar un laberinto
en trminos de caracteres ASCII, donde nf es el nmero de filas y nc
el nmero de columnas de la matriz de caracteres matlab. Dentro
de dicha matriz, las paredes infranqueables estn representadas por
+, los espacios por donde se puede circular con , la entrada por
E y la salida por S.
typedef struct {
int nf,nc;
char ** matlab;
} Laberinto_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
S
+
+
+
+
Para resolver el laberinto (uniendo la entrada con la salida sin atravesar ninguna pared) contenido en el
archivo laberinto.txt (que contiene en la primera lnea el nmero de filas y columnas y luego la matriz de
caracteres) deber implementar las siguientes funciones:
// Crea y devuelve un nuevo laberinto de nf filas por nc columnas
Laberinto_t * CreaLaberinto(int nf, int nc);
// Destruye el laberinto l liberando toda la memoria asociada
void DestruyeLaberinto(Laberinto_t *l);
// Crea y devuelve un nuevo laberinto y inicalizado a partir del archivo de texto
Laberinto_t * IngresaLaberinto(const char * archivo);
// Setea el elemento (i,j) de la matriz de laberinto con c (retorno: 0 ok, -1 error)
int SetLaberintoElement(Laberinto_t *l, int i, int j, char c);
// Obtiene y retorna el elemento (i,j) del laberinto, en caso de error retorna -1
int GetLaberintoElement(Laberinto_t *l, int i, int j);
// Busca dentro de la matriz el elemento igual al caracter contenido en E y pone sus
// coordenadas en (piE,pjE). retornando 1 si lo encuentra y 0 sino.
int BuscaElementoLaberinto(Laberinto_t *l, char E, int * piE, int * pjE);
// Resuelve el laberinto l, a partir del elemento (i,j) colocando caracteres o para
// marcar el camino. Si logra llegar a la salida retorna 1, sino 0.
int ResuelveLaberinto(Laberinto_t *l, int i, int j);
// Imprime el laberinto l
void ImprimeLaberinto(Laberinto_t *l);
// crea retorna una nueva matriz de chars de nf filas por nc columnas.
char ** AllocaMatrizChar(int nf, int nc);
// libera la matriz creada por AllocaMatrizChar
void LiberaMatrizChar(char **m, int nf);
Con la ayuda de estas funciones, implemente un programa que resuelva el laberinto del archivo laberinto.txt,
marcando el camino entre la entrada (E) y la salida (S) con caracteres o
Por otra parte, existen varias representaciones ms compactas de una Matriz rala. Una de ellas se denomina
CSR (Compressed Sparse Row), que usa una estructura
typedef struct{
era numero de filas en el archivo (algo mas lgico)
int Nrow;
// nmero de elementos no nulos de la matriz
float *Val; // Array de tamao nnz conteniendo los valores de la matriz
int *csrRowIdx; // ver enunciado
int *ColIdx; // Array de tamao nnz conteniendo los ndices
//de columna de los elementos de la matriz
} CSRMatrix_t;
En este caso, csrRowIdx es un arreglo de enteros de tamao Nrow+1. El i-esimo elemento de este arreglo
contiene un ndice a los arreglos Val y ColIdx, apuntando al primer elemento no nulo de cada fila de la matriz,
mientras que el ltimo elemento de ColIdx es nnz. Por ejemplo, si
1.0 4.0 0
0
0
0 2.0 3.0 0
0
=
5.0 0
0 7.0 8.0
0
0 9.0 0 6.0
la representacin CSR es:
Val
csrRowIdx
ColIdx
= 0
= 0
2
1
4
1
7
2
9
0
Se desea construir una biblioteca para manejar matrices ralas, en cualquiera de estos formatos. Para ello,
implemente las siguientes funciones:
a) Manejo de matrices en representacin COO
// Inicializa una matriz en representacin COO
COOMatrix_t *IniciaCOOMatrix(int Nrow, int Ncol, int nnz);
// Inserta el elemento b en la posicin i,j en A.
void SetCOOMatrixElement(COOMatrix_t A, float b, int i, int j);
// Obtiene el elemento que se encuentra en la posicin i,j de A.
float GetCOOMatrixElement(COOMatrix_t A, int i, int j);
Asuma que en cualquier representacin la matriz se llena y est ordenada por filas. Esto puede ser importante
a la hora de programar las funciones que ponen los elementos en la matriz. En SparseMatrix.h estn los
prototipos de estas funciones, y algunas funciones auxiliares tiles.
La posicin del mximo de intensidad de Icorr indica la presunta posicin de Iobj en Ippal donde