void main(){ FILE *fichero; int N, S, X; int distancia[PLACES+1][PLACES+1]; int RnU [PLACES+1][COL]; solution_step sol[PLACES+2]; int visited[PLACES+2]; int variante, estrategia; int i, j; fichero = fopen(INPUTFILE, "r"); /*Lectura de datos */ fscanf(fichero, "N\t%d\n", &N); fscanf(fichero, "S\t%d\n", &S); fscanf(fichero, "X\t%d\n", &X); /*Lectura del array de distancias*/ for(i=0; i<=PLACES; i++){ for(j=0; j<PLACES; j++) fscanf(fichero, "%d\t", &distancia[i][j]); fscanf(fichero, "%d\n", &distancia[i][j]); } /*Lectura de Resources 'n Units*/ /* Cuadramos una fila extra para que se ajusten los mismos * índices en todas las tablas */ RnU[0][0]=0; RnU[0][1]=0; RnU[0][2]=0; for(i=1; i<=PLACES; i++) fscanf(fichero, "RU%d\t%d\t%d\n", &RnU[i][0], &RnU[i][1], &RnU[i][2]); fclose(fichero); printf("Datos:\n"); /*Mostramos datos */ printf("N: %d\n", N); printf("S: %d\n", S); printf("X: %d\n", X); printf("Distancias:\n"); /*Distancias */ for(i=0; i<=PLACES; i++){ for(j=0; j<PLACES; j++) printf("%d\t", distancia[i][j]); printf("%d\n", distancia[i][j]); } printf("Recursos y Unidades:\n"); /*Recursos y Unidades */ for(i=1; i<=PLACES; i++){ for(j=0; j<(COL -1); j++) printf("%d\t", RnU[i][j]); printf("%d\n", RnU[i][j]); } /*Inicializamos la estructura */ sol[CAMP].S = S; /* - Día */ sol[CAMP].day=0; /* - Posición */ sol[CAMP].position = CAMP; /* - Unidades */ sol[CAMP].units = 0; /* - Oro obtenido */ sol[CAMP].g_obtained = 0; /* - Oro gastado */ sol[CAMP].g_spent = 0; /* - Balance (oro total) */ sol[CAMP].balance = X; /* - Visitados */ visited[0]=TRUE; for(i=1; i<PLACES+1; i++) visited[i]=FALSE; /*Fin estructura */ do{ printf("\n==========="); printf("\nSeleccione:"); printf("\n==========="); printf("\n1. Variante 1\n2. Variante 2\n3. Variante 3\n=>"); scanf("%d", &variante); if((variante<=0) || (variante >3)) printf("Error: Introduzca un valor [1, 3]\n"); }while((variante<=0) || (variante >3)); do{ printf("\n==========="); printf("\nSeleccione:"); printf("\n==========="); printf("\n1. Algoritmo voraz \n2. Backtracking \n3. Prog. Dinamica \n=>"); scanf("%d", &estrategia); if((estrategia<=0) || (estrategia >3)) printf("Error: Introduzca un valor [1, 3]\n"); }while((estrategia<=0) || (estrategia >3)); if(estrategia == 1) voraz(distancia, RnU, visited, variante, sol); else if(estrategia == 2) back(distancia, RnU, visited, variante, sol, INITIAL_STEP); else if (estrategia == 3) progdin(distancia, RnU, visited, variante, sol); }
int main(int argc, char ** argv) { int ** tablero; int dimension; char * fichero; int filini; int colini; int algoritmo; int tipo_salida; par * s; int peso; int aux; crono c; /* argumentos, alguna primera idea!!!! * * camino [opciones] fichero * -f fila * -c columna * -[vdb] voraz dinamica backtraking * -n N * -[am] all info, o minima informacion por pantalla * fichero * * Todos obligatorios! luego tenemos 8 argumentos más el nombre del * programa, tambien damos la opcion a la particula --help * */ if (argc != 10) { return pinta_ayuda(); } for (aux = 1; aux < 10; aux++) { if (strcmp(argv[aux], "-f") == 0) { aux++; filini = atoi(argv[aux]); } else if (strcmp(argv[aux], "-c") == 0) { aux++; colini = atoi(argv[aux]); } else if (strcmp(argv[aux], "-n") == 0) { aux++; dimension = atoi(argv[aux]); } else if (strcmp(argv[aux], "-v") == 0) { algoritmo = VORAZ; } else if (strcmp(argv[aux], "-vm") == 0) { algoritmo = VORAZMEJORADO; } else if (strcmp(argv[aux], "-d") == 0) { algoritmo = DINAMICA; } else if (strcmp(argv[aux], "-b") == 0) { algoritmo = BT; } else if (strcmp(argv[aux], "-a") == 0) { tipo_salida = ALLINFO; } else if (strcmp(argv[aux], "-m") == 0) { tipo_salida = MINIMO; } else { fichero = argv[aux]; } } /* aunque no tratemos todas las situaciones, por lo menos hacemos una * pequeña comprobacion*/ if ((filini > dimension) || (colini > dimension)) { fprintf(stderr, "Fila o columna erroneas: fuera del rango\n"); return -1; } tablero = leer_tablero(fichero, dimension); if (tablero == NULL) { fprintf(stderr, "ERROR obteniendo el tablero.\n"); return -1; } /* reservamos la memoria para s! */ s = (par *)malloc(MAXNIVEL*sizeof(par)); /* y aplicamos el algoritmo segun la entrada */ switch (algoritmo) { case VORAZ: start_crono(&c); if (voraz(tablero, dimension, filini, colini,&peso, s) == -1) { printf("%d No hay solucion\n", dimension); stop_crono(&c); return -1; } stop_crono(&c); break; case VORAZMEJORADO: start_crono(&c); if (voraz_mejorado(tablero, dimension, filini, colini, &peso, s) == -1) { printf("%d No hay solucion\n", dimension); stop_crono(&c); return -1; } stop_crono(&c); break; case DINAMICA: start_crono(&c); dinamica(tablero, dimension, filini, colini, &peso, s); stop_crono(&c); break; case BT: start_crono(&c); bt(tablero, dimension, filini, colini, &peso, s); stop_crono(&c); break; default: ; } if (tipo_salida == ALLINFO) { pinta_solucion(s, peso, algoritmo, dimension, c); } else { pinta_solucion_minima(dimension, algoritmo, c); } return 0; }