diff --git a/tp4/lib_conjunto.c b/tp4/lib_conjunto.c index 3ddab0985eaa95b7e2c5728d9f1903f718e188b9..b4907d7544caef4ee8671a873e61a3071b204c82 100644 --- a/tp4/lib_conjunto.c +++ b/tp4/lib_conjunto.c @@ -26,7 +26,6 @@ conjunto_t *cria_cjt(int max) { } conjunto_t *destroi_cjt(conjunto_t *c) { - c->card = 0; free(c->v); c->v = NULL; free(c); diff --git a/tp4/tp4 b/tp4/tp4 new file mode 100755 index 0000000000000000000000000000000000000000..9d9ad0fca0d22b2b508e54470ba4c6ec6a2a4732 Binary files /dev/null and b/tp4/tp4 differ diff --git a/tp4/tp4.c b/tp4/tp4.c index 5f3e4f622e533d00d8d7e7474616da66f2de6c62..d7f510c2a98ab1543c4ce206cf79e620cb9fee3a 100644 --- a/tp4/tp4.c +++ b/tp4/tp4.c @@ -3,19 +3,106 @@ #include "lib_conjunto.h" #define MAX 100 -int main () -{ +conjunto_t *le_conjunto_simples(int max) { + conjunto_t *leitura; + if ( !(leitura = cria_cjt(max)) ) + return NULL; + int n; + scanf("%d", &n); + while (n) { + insere_cjt(leitura, n); + scanf("%d", &n); + } + return leitura; +} - /* ler os herois e suas habilidades */ +conjunto_t **le_vetor_conjuntos(int *tam, int max) { + conjunto_t **vetor_c; + if ( !(vetor_c = malloc(sizeof(conjunto_t *) * max)) ) + return NULL; + int n, m; + scanf("%d", &n); + while (n) { + if ( !(vetor_c[*tam] = cria_cjt(10)) ) + return NULL; + insere_cjt(vetor_c[*tam], n); + scanf("%d", &m); + while (m) { + insere_cjt(vetor_c[*tam], m); + scanf("%d", &m); + } + *tam = *tam + 1; + scanf("%d", &n); + } + return vetor_c; +} - /* ler a missao */ +conjunto_t **libera_vetor_conjuntos(conjunto_t **vetor_c, int tam) { + int i; + for (i = 0; i < tam; i++) + vetor_c[i] = destroi_cjt(vetor_c[i]); + free(vetor_c); + return NULL; +} +conjunto_t *acha_solucao(conjunto_t **herois, conjunto_t *missao, conjunto_t **equipes, int tam_equipes) { + conjunto_t *menor; + menor = cria_cjt(10); + conjunto_t *uniao_old; + conjunto_t *uniao; + int i, j; + + for (i = 0; i < tam_equipes; i++) { + uniao = copia_cjt(herois[equipes[i]->v[0] - 1]); + /* copia o conjunto de habilidades de heroi correspondente ao primeiro elemento do conjunto equipe da posicao atual do vetor de equipes. ex: se a equipe atual é [5 6 7], copia o quinto conjunto de habilidades de heroi (de indice 4). */ + for (j = 1; j < equipes[i]->card; j++) { + uniao_old = uniao; + uniao = uniao_cjt(uniao, herois[equipes[i]->v[j] - 1]); + uniao_old = destroi_cjt(uniao_old); + } + /* realiza a uniao de todos os conjuntos de habilidades de heroi referenciados no conjunto equipe da posicao atual do vetor de equipes. */ + if (contido_cjt(missao, uniao)) { + if (vazio_cjt(menor) || equipes[i]->card < menor->card) { + menor = destroi_cjt(menor); + menor = copia_cjt(equipes[i]); + } + } + uniao = destroi_cjt(uniao); + } + + return menor; +} + +int main() { + /* ler os herois e suas habilidades */ + int tam_herois = 0; + conjunto_t **vetor_herois; + vetor_herois = le_vetor_conjuntos(&tam_herois, MAX); + + /* ler a missao */ + conjunto_t *missao; + missao = le_conjunto_simples(20); + /* ler as equipes de herois */ + int tam_equipes = 0; + conjunto_t **vetor_equipes; + vetor_equipes = le_vetor_conjuntos(&tam_equipes, MAX); /* a solucao eh encontrada se a missao esta contido na uniao das * habilidades de uma equipe, mas tomando-se aquela de menor tamanho. */ + conjunto_t *solucao; + solucao = acha_solucao(vetor_herois, missao, vetor_equipes, tam_equipes); + if (vazio_cjt(solucao)) { + printf("NENHUMA\n"); + } else { + imprime_cjt(solucao); + } /* libera toda a memoria alocada dinamicamente */ + vetor_herois = libera_vetor_conjuntos(vetor_herois, tam_herois); + missao = destroi_cjt(missao); + vetor_equipes = libera_vetor_conjuntos(vetor_equipes, tam_equipes); + solucao = destroi_cjt(solucao); return 0; }