Práctica de Resolución de Algoritmos Resolver las siguientes funciones, considerando que las mismas deben ser independientes del contexto, o sea, como si se realizarán componentes aislados de una aplicación, las cuales deben funcionar sin depender del contexto. Todo lo que se requiere, debe ser incorporado como parámetro de entrada. Ejercicio 1 Dada una matriz de “chars”de n x m, que representa un tablero donde se está jugando a la batalla naval. En este tablero, puede haber caracteres en blanco (los cuales indican agua), caracteres con “B” (los cuales indican parte de un barco) y caracteres con “X” (que indican un barco tocado). Se pide realizar una función de forma que dada una posición (x,y) la función deberá contestar “Agua”, “Tocado” o “Hundido” según corresponda, entendiendo que no se sabe cuantos casilleros componen un barco y que los barcos pueden ser colocados en forma horizontal o vertical. Ejercicio 2 Realizar una función que dada una matriz de “chars” de n x m y una posición inicial (x,y) que tiene una “I” en la matriz, encuentre el camino a la posición completada con una “S”, considerando que existen posiciones en la matriz, marcadas con “X” que representan “muros”, los cuales no se pueden traspasar. Ejercicio 3 Realizar una función recursiva que reciba un string e invierta los caracteres que lo componen, con el siguiente prototipo: void Invertir (char * cadena, int longitud). Ejercicio 4 Realizar una función con el siguiente prototipo int funcion (char* str, char caract), la cual borra del string str todos los caracteres con el contenido de la variable caract que encuentre y retorna la cantidad de elementos eliminados, sin utilizar otro string de apoyo. Ejercicio 5 Realizar una función que espeje un árbol binario, o sea que lo Invierta, deforma tal que todo lo que está a la derecha quede a la izquierda y viceversa. Ejercicio 6 Realizar una función con el siguiente prototipo int funcion (char* str1, char *str2), la cual borra el string str2 si el mismo se encuentra incluido en str1. Ejercicio 7 Dada una matriz de n x m se desea realizar una función que encuentre el string recibido como parámetro, en dicha matriz, el cual puede estar escrito horizontal, vertical o en diagonal. Ejercicio 8 Dada una matriz de enteros de n x m, completada con unos o ceros. Realizar una función que reciba un vector de enteros de longitud “t”, conteniendo unos y que verifique donde pueden ser insertados en la matriz, considerando que solo se pueden insertar en posiciones que haya ceros y que deben insertarse todos juntos en forma horizontal o vertical. Ejercicio 9 Realizar una función que reciba un string y verifique si el mismo es palíndromo, o sea capicúa, con el siguiente prototipo: void verifica (char * cadena, int longitud). Ejercicio 10 Realizar una función que ordene 9 números distintos de un dígito (del 1 al 9), en una matriz de 3 x 3, de forma tal que las sumas horizontales, verticales y diagonales, entre dichos números de siempre el valor 15. Ejercicio 11 Dada la siguiente estructura: struct Nodo { unsigned char Clave; struct Nodo *Prev; struct Nodo *Next; struct Dato * datos; } la cual define una lista doblemente enlazada. Se pide: Escribir una función recursiva con el siguiente prototipo: void Sort(struct Nodo *) la cual debe ordenar la lista y eliminar las claves duplicadas si las hubiese, (dejando solo una de ellas), sin utilizar ninguna estructura auxiliar de apoyo. Ejercicio 12 Desarrollar la función DeleteFile(char *file, struct Directory *dir,struct FAT *fat); la cual elimina un archivo especificado. Teniendo en cuenta las siguientes condiciones: ¾ Toda la información es grabada en forma contigua. ¾ El Sistema Operativo trabaja con un límite de 256 archivos por bloque. ¾ Si un cluster esta ocupado parcialmente, no se completa el resto del mismo. Struct Directory { char *Name; struct File *Files; struct Directory *ParentDirectory; struct Directory *SonDirectory; struct Directory *NextBlock; unsigned long ClusterNumber; }; Struct File { char *Name; unsigned long Size; unsigned long FirstCluster; unsigned char *Atributos; struct Directory *dir; int Mode; }; Struct FAT { long *Clusters; unsigned long FreeSpace; unsigned int ClusterSize; unsigned long ClustersFree; }; Ejercicio 13 Dada las siguiente estructuras: struct Tree { int Clave; struct Tree *Father; struct Tree *Rightson; struct Tree *Leftson; struct File *Files; } struct File { char *Name; int lenght; char *Atributes; struct File *Next; }; las cuales representan la estructura de la FAT. Se pide escribir la función: File *DirTree(struct Tree *Root ,int Target) la cual recibe la dirección del directorio principal (Root) y debe imprimir en pantalla los archivos que componen el directorio solicitado (Target). Ejercicio 14 Realizar una función que juegue al SUDOKU, esto es que coloque en una matriz de 9 x 9 números de 1 dígito (del 1 al 9), de forma tal que en la misma fila y columna no se encuentren repetidos y por otro lado que en cada submatriz de 3 x 3 no se repita ninguno de los dígitos. Ejercicio 15 Realizar una función que dado un árbol binario de búsqueda implementado sobre un vector de enteros, realice la baja de un elemento pasado como parámetro. Ejercicio 16 Realizar una función recursiva que dado un string, imprima en pantalla la letra que más veces se repite dentro del string y la cantidad de repeticiones de la misma. Se aclara que no pueden utilizarse estructuras auxiliares como vectores, listas, etc. Ejercicio 17 Realizar una función que reciba como parámetro un string denominado “cadena” de n caracteres y que imprima todas las combinaciones posibles de substrings de “cadena” tomados de a t elementos, considerando que siempre t es <= n, con el siguiente prototipo: combina(char * cadena, int n, int t) Ejercicio 18 Realizar una función que dada una matriz de 3 x 3, la cual representa un tablero de TATETI, haga una movida de la ficha recibida como parámetro, considerando que en este juego NUNCA se puede perder, a lo sumo empatar. Ejercicio 19 Realizar una función que reciba como parámetro un string denominado “cuenta” de n caracteres los cuales contienen una expresión matemática del tipo “3+5/2*53*9”, y que retorne el resultado de la cuenta, considerando la precedencia de los operadores. Ejercicio 20 Realizar una función que coloque 8 “X”, que representan 8 reinas en una matriz de 8 x 8, la cual representa un tablero de ajedrez, de forma tal que ninguna de las reinas puedan darse jaque, o sea, que no estén en la misma fila, columna o diagonales. Ejercicio 21 Realizar una función que moviéndose como un caballo, o sea 2 x 1, complete una matriz de 8 x 8, la cual representa un tablero de ajedrez, deberá marcar los 64 casilleros, con números del 1 al 64, indicando el camino utilizado, sin pasar dos veces por la misma posición. Ejercicio 22 Dada las siguientes estructuras: struct proceso { char nombre[20]; int inicio; int duracion; struct depende * pr; }; struct depende { struct proceso * nodo; struct depende * next; }; Las cuales representan un PERT, para el seguimiento de un proyecto, donde la estructura proceso contienen las diferentes tareas a realizar en el proyecto y la estructura depende, es una lista que contiene las dependencias de cada uno de los procesos, o sea, todos los procesos que deben ejecutarse antes que él. Realizar una función que considerando que todos los procesos están creados y todas las dependencias y las duraciones de cada uno de ellos están cargadas, debe completar el día de inicio de cada uno de los procesos y retornar la longitud total del proyecto en días. Ejercicio 23 struct sala { char nombre[20]; struct puertas * puerta; }; struct puertas { struct sala * nodo; struct puertas * next; }; Las cuales representan un laberinto de salas con puertas que las comunican con otras salas.. Realizar una recibiendo una sala como parámetro encuentre el camino más corto a la salida, la cual está representada por la sala con el nombre “SALIDA”. Se debe considerar que una puerta esta en la lista de dos salas si las vincula entre si debido a que no le pertenece en forma exclusiva a ninguna de las dos. Ejercicio 24 Realizar una función que dado un vector compuesto por elementos de la estructura figura (struct figura) imprima en pantalla los nombres de las figuras que no se toquen ni superpongan con ninguna otra. struct figura { char nombre[20]; int alto; int ancho; int x; int y; };