1
0
Files
Laboratori-ASD/Laboratorio 5/Esercizio 1/main.c
2024-03-22 17:37:24 +01:00

104 lines
2.5 KiB
C

// Laboratorio 5 - Esercizio 1
// Matteo Schiff - s295565
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int start, end;
} att;
void readFile(att **val, int *N, char *filename) {
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL) {
printf("Impossibile aprire il file di input %s", filename);
exit(1);
}
fscanf(fp, "%d", N);
*val = (att *) malloc(*N * sizeof(att));
for (int i = 0; i < *N; i++) {
fscanf(fp, "%d %d", &(*val)[i].start, &(*val)[i].end);
}
fclose(fp);
}
int controllaCompatibile(att *val, int N, int pos, int *selezioni) {
int compatibile = 1;
att last = val[pos];
for (int i = 0; i < N && compatibile; i++) {
if (i != pos && selezioni[i] == 1) {
if (val[i].start < last.end && last.start < val[i].end)
compatibile = 0;
}
}
return compatibile;
}
void stampaSoluzione(int *soluzione, att *val, int N) {
for (int i = 0; i < N; i++) {
if (soluzione[i] == 1) {
printf("(%d, %d) ", val[i].start, val[i].end);
}
}
printf("\n");
}
void attSelR(int N, att *val, int pos, int *selezioni, int *soluzione, int durata, int *durata_soluzione) {
// Terminazione
if (pos >= N) {
if (durata > *durata_soluzione) {
*durata_soluzione = durata;
// copio nuova soluzione
for (int i = 0; i < N; i++) {
soluzione[i] = selezioni[i];
}
}
return;
}
// inserisco un attività solo se è compatibile con il resto della soluzione
if (controllaCompatibile(val, N, pos, selezioni)) {
selezioni[pos] = 1;
int d = val[pos].end - val[pos].start;
attSelR(N, val, pos+1, selezioni,soluzione, durata+d, durata_soluzione);
}
// continuo ad esplorare senza prendere l'attività
selezioni[pos] = 0;
attSelR(N, val, pos+1, selezioni,soluzione, durata, durata_soluzione);
return;
}
void attSel(int N, att *v) {
int durata_soluzione = 0;
int *selezioni = (int *) calloc(N, sizeof(int));
int *soluzione = (int *) calloc(N, sizeof(int));
attSelR(N, v, 0, selezioni, soluzione, 0, &durata_soluzione);
printf("Migliore soluzione:\n");
stampaSoluzione(soluzione, v, N);
printf("Durata della migliore soluzione: %d\n", durata_soluzione);
free(selezioni);
free(soluzione);
}
int main(int argc, char const *argv[])
{
att *val;
int N;
readFile(&val, &N, "att.txt");
attSel(N, val);
free(val);
return 0;
}