Untitled

 avatar
unknown
c_cpp
3 years ago
3.8 kB
3
Indexable
#define tempoParado  15
#define tempoMovendo 5

int tempoAtenderChamada (Elevador *elevador, int andar, int direcao) {
    int tempo = 0;

    switch (elevador->estado) {
        case 0: {
            if (vaziaFila(elevador->destino)) {
                if (elevador->andar_atual < andar) {
                    for (int i = elevador->andar_atual; i <= andar; i++)
                        tempo += tempoMovendo;
                    return tempo;
                } else if (elevador->andar_atual > andar) {
                    for (int i = elevador->andar_atual <= andar; i >= andar; i--) {
                        tempo += tempoMovendo;
                    }
                    return tempo;
                } else
                    return 0;
            }
            else {
                if (elevador->andar_atual < elevador->destino->fim->andar) {
                    for (int i = elevador->andar_atual; i <= elevador->destino->fim->andar; i++) {
                        if (buscaNodo(elevador->destino, i) != NULL)
                            tempo += tempoParado;
                        else
                            tempo += tempoMovendo;
                        }
                } else if (elevador->andar_atual > elevador->destino->fim->andar) {
                    for (int i = elevador->andar_atual; i >= elevador->destino->fim->andar; i--) {
                        if (buscaNodo(elevador->destino, i) != NULL)
                            tempo += tempoParado;
                        else
                            tempo += tempoMovendo;
                        }
                    }
                return tempo;
            }
        }
        case 1: {
            if (elevador->andar_atual < andar) {
                for (int i = elevador->andar_atual; i <= andar; i++) {
                    if (buscaNodo(elevador->destino, i) != NULL)
                        tempo += tempoParado;
                    else
                        tempo += tempoMovendo;
                }
                return tempo;
            } else if (elevador->andar_atual > andar) {
                for (int i = elevador->andar_atual; i >= elevador->destino->fim->andar; i--) {
                    if (buscaNodo(elevador->destino, i) != NULL)
                        tempo += tempoParado;
                    else
                        tempo += tempoMovendo;
                    }
                return tempo;
            } else
                return 0;
        }
        case 2: {
            if (elevador->andar_atual < andar) {
                for (int i = elevador->andar_atual; i >= elevador->destino->fim->andar; i--) {
                    if (buscaNodo(elevador->destino, i) != NULL)
                        tempo += tempoParado;
                    else
                        tempo += tempoMovendo;
                }
                return tempo;
            } else if (elevador->andar_atual > andar) {
                for (int i = elevador->andar_atual; i <= andar; i++) {
                    if (buscaNodo(elevador->destino, i) != NULL)
                        tempo += tempoParado;
                    else
                        tempo += tempoMovendo;
                }
                return tempo;
            } else
                return 0;
        }
    }
}

Elevador *elevadorMaisProx(Elevador **elevador, int numElevadores, int andar, int direcao) {
    Elevador *maisProx = elevador[0];
    int menorTempo = tempoAtenderChamada(elevador[0], andar, direcao);
    //puts("done");
    for (int i = 1; i < numElevadores; i++) {
        if (tempoAtenderChamada(elevador[i], andar, direcao) < menorTempo) {
            maisProx = elevador[i];
            menorTempo = tempoAtenderChamada(elevador[i], andar, direcao);
        }
    }
    return maisProx;
}
Editor is loading...