Advertisement
ViniciusSDSilva

Ex2ED2

Apr 25th, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.67 KB | None | 0 0
  1. //-----------------------------------------
  2.  
  3. // EXERCICIO 2
  4. // POR GABRIEL FERREIRA E VINICIUS SANTIAGO
  5. // M 78218 e M 78208
  6.  
  7. //-----------------------------------------
  8.  
  9. #include <stdio.h>
  10. #include <conio.h>
  11. #include <stdlib.h>
  12. #include <time.h>
  13.  
  14. int matriz[10][10];                  
  15. int cAtual[11], cOriginal[11] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, cMenorCusto[11];
  16. int n = 5, menorCusto;
  17.  
  18. void ler();
  19.  
  20. void imprimir(int vetor[11]);
  21. void imprimirValorSoma(int soma);
  22. void inverter(int inicio, int fim);
  23. void copiar(int vetor1[11], int vetor2[11]);
  24.  
  25. void calcularHeuristica();
  26. int calcularValor(int caminho[11]);
  27. void validaCaminho(int caminho[11]);
  28.  
  29. int main() {   
  30.   srand(time(NULL));
  31.  
  32.   ler();
  33.  
  34.   calcularHeuristica();
  35.  
  36.   printf("\n\nMenor custo possivel: %d\n", menorCusto);
  37.   printf("--------------------------------");
  38.   imprimir(cMenorCusto);
  39.  
  40.   return 0;
  41. }
  42.  
  43. int calcularValor(int caminho[11]) {
  44.     int soma = 0, i;
  45.    
  46.     for(i = 0; i < n - 1; i++) {
  47.         if(matriz[caminho[i]][caminho[i + 1]] != 0) {
  48.             soma += matriz[caminho[i]][caminho[i + 1]];
  49.             //printf("\nmatriz[%d][%d]: %d", caminho[i], caminho[i+1], matriz[caminho[i]][caminho[i + 1]]);
  50.         } else {
  51.             soma = 0;
  52.             break;
  53.         }
  54.        
  55.     }
  56.    
  57.     if(soma > 0) {
  58.         if(matriz[caminho[i]][caminho[0]] != 0) {
  59.             soma += matriz[caminho[i]][caminho[0]];
  60.             if(soma < menorCusto) {
  61.                 menorCusto = soma;
  62.                 copiar(cMenorCusto, caminho);
  63.             }
  64.             //printf("\nmatriz[%d][%d]: %d", caminho[i], caminho[0], matriz[caminho[i]][caminho[0]]);
  65.         } else {
  66.             soma = 0;
  67.         }
  68.     }
  69.    
  70.     return soma;
  71.    
  72. }
  73.  
  74. void calcularHeuristica() {
  75.     int j, i;
  76.     for(j = 2; j < n; j++) {
  77.         printf("\n\nFazendo troca entre %d\n", j);
  78.        
  79.         for(i = 1; i < n - j + 1; i++) {
  80.             inverter(i, i + j - 1);
  81.             imprimir(cAtual);
  82.             imprimirValorSoma(calcularValor(cAtual));
  83.         }
  84.         getch();
  85.     }
  86. }
  87.  
  88. void imprimirValorSoma(int soma) {
  89.     if(soma > 0) {
  90.         printf(" = %d", soma);
  91.     } else {
  92.         printf(" = Alguma aresta eh vazia!");
  93.     }
  94. }
  95.  
  96. void inverter(int inicio, int qt) {
  97.     int fim = inicio + qt + 1;
  98.     int temp;
  99.    
  100.     copiar(cAtual, cOriginal);
  101.     int contador;
  102.     for (contador = inicio; contador < fim/2; ++contador){
  103.         temp = cAtual[contador];
  104.         cAtual[contador] = cAtual[fim - contador - 1];
  105.         cAtual[fim - contador - 1] = temp;
  106.    }
  107. }
  108.  
  109. void copiar(int vetor1[11], int vetor2[11]) {
  110.     int i;
  111.     for(i = 0; i < n; i++) {
  112.         vetor1[i] = vetor2[i];
  113.     }
  114. }
  115.  
  116. void imprimir(int vetor[11]) {
  117.     printf("\n");
  118.     int i;
  119.     for(i = 0; i < n; i++) {
  120.         printf("%d --> ", vetor[i]);
  121.     }
  122.     printf("%d", vetor[0]);
  123. }
  124.  
  125. void imprimirMatriz() {
  126.   int i, j;
  127.  
  128.   printf("\n     ");
  129.  
  130.   for(i = 0; i < n; i++) {
  131.     printf("%2d ", i);
  132.   }
  133.  
  134.   printf("\n-----");
  135.  
  136.   for(i = 0; i < n; i++) {
  137.     printf("---");
  138.   }
  139.  
  140.   printf("\n");
  141.  
  142.   for(i = 0; i < n; i++) {
  143.     printf("%2d | ", i);
  144.     for(j = 0; j < n; j++) {
  145.         printf("%2d ", matriz[i][j]);
  146.       }
  147.       printf("\n");
  148.   }
  149. }
  150.  
  151. void ler() {
  152.     int i, j;
  153.    
  154.     n = (rand() % 7) + 3;
  155.    
  156.     printf("Numero de nodos = %d\n", n);
  157.    
  158.     for(i = 0; i < n; i++) {
  159.         for(j = 0; j < n; j++) {
  160.             matriz[i][j] = rand() % 10;
  161.         }
  162.     }
  163.    
  164.     for(i = 0; i < n; i++) {
  165.         matriz[i][i] = 0;
  166.     }
  167.    
  168.     imprimirMatriz();
  169.    
  170.     do {
  171.        
  172.         cOriginal[0] = rand() % n;
  173.        
  174.         for(i = 0; i < n; i++) {
  175.             int x = rand() % n;
  176.            
  177.             for(j = 0; j < i; j++) {
  178.                 if(cOriginal[j] == x) {
  179.                     i--;
  180.                     break;
  181.                 } else {
  182.                     cOriginal[i] = x;
  183.                 }
  184.             }
  185.             //printf("\ncOriginal[%d] = %d", j, cOriginal[j]);
  186.         }
  187.     } while(calcularValor(cOriginal) == 0);
  188.    
  189.     imprimir(cOriginal);
  190.     imprimirValorSoma(calcularValor(cOriginal));
  191.    
  192.     copiar(cMenorCusto, cOriginal);
  193.     menorCusto = calcularValor(cOriginal);
  194.  
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement