-
Notifications
You must be signed in to change notification settings - Fork 1
/
elevador-extra.c
92 lines (71 loc) · 3.04 KB
/
elevador-extra.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int cmpfunc (const void * a, const void * b) {//função para auxilar no qsort
return ( *(int*)a - *(int*)b );
}
int algoritmoDoElevador(char *arr){
int bordaDoDisco,quantElemento,elementoInicial,posDoElementoInicial,soma;
int flagBordaDoDisco;
int tamanhoString,i;
flagBordaDoDisco = 0;
quantElemento = 0;//quantidade de elementos que foram passados
tamanhoString = strlen(arr);//tamanho da string de entrada
for(i=0;i< tamanhoString;i++){
if(arr[i]==' '){
quantElemento++;//quantidade de numeros no vetor menos a primeira entrada
}
}
int vetorElementos[quantElemento];//vetor que guardara os elementos +1 contando com o elemento inicial que é a borda do disco
int contador;//contador para o vetor de elementos
contador = 0;
//Split de todos numeros passados
char * token = strtok(strdup(arr), " ");//split da string passada
bordaDoDisco = atoi(token);//pega o primeiro numero que é a borda do disco
while( token != NULL ) {//while necessario para fazer o split
//printf( " %s\n", token ); //printing each token
if(atoi(token)>bordaDoDisco){//se algum elemento for maior que a borda do disco...
flagBordaDoDisco = 1;
break;
}
token = strtok(NULL, " ");
vetorElementos[contador] = atoi(token);//pega todos elementos menos o primeiro
contador++;
}
if(flagBordaDoDisco == 1){ //entao é porque a entrada passada é maior que a borda do disco entao não pode
return -1;
}
elementoInicial = vetorElementos[0];//primeiro elemento, antes de ordenar
qsort(vetorElementos, quantElemento, sizeof(int), cmpfunc);//função que ordena a entrada em ordem crescente
for(i=0;i<quantElemento;i++){
if(vetorElementos[i]==elementoInicial){
posDoElementoInicial = i; //indice do elemento inicial no vetor ordenado
break;
}
}
soma = 0;
for (i=posDoElementoInicial;i<quantElemento-1;i++){//todos elementos a frente do elemento inicial no vetor ordenado
soma+=abs(vetorElementos[i+1]-vetorElementos[i]);//ou seja vai no sentido mais externo do disco
}
for (i=posDoElementoInicial;i>0;i--){
if (i==posDoElementoInicial){//condicao para pegar o ultimo elemento do loop anterior e subtrair com o anterior do primeiro elemento
soma += abs(vetorElementos[quantElemento-1] - vetorElementos[i-1]);
}
else{
soma += abs(vetorElementos[i]-vetorElementos[i-1]);
}
}
return soma;
}
int main() {
int resultado;
resultado=algoritmoDoElevador("199 53 98 183 37 122 14 124 65 67");
int nDigits = floor(log10(abs(resultado))) + 1;
char resultadoEmString[nDigits];
itoa(resultado,resultadoEmString,10);
if(resultado!=-1){//se todos passados forem menores que a borda do disco é porque deu certo.
printf("Movimentacoes do braco do disco: %s",resultadoEmString);
}
return 0;
}