Advertisement
sconetto

EDA - Labirinto

May 12th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <time.h>
  5. #define MAX 1000 /*Capacidade de armazenamento da pilha e da fila*/
  6. #define N 33 /*Tamanho da matriz que representa o labirinto*/
  7. #define LIVRE 0 /*Marca de posicao livre no labirinto*/
  8. #define PAREDE 32767  /*Marca de posicao com parede no Labirinto*/
  9. #define RED   "\x1B[31m"
  10. #define RESET "\x1B[0m"
  11. #define GRN   "\x1B[32m"
  12. typedef int titem;/*Tipo dos itens armazenados na pilha e na fila*/
  13. typedef struct fila{
  14.   int inicio; /*primeira posicao cheia*/
  15.   int fim;/*ultima posicao cheia*/
  16.   titem elementosX[MAX];
  17.   titem elementosY[MAX];
  18. } Fila;
  19. /*Declaracao das funcoes*/
  20. void fila_cria(Fila* f);
  21. int fila_vazia(Fila* f);
  22. void insereFila(titem x, titem y, Fila *F);
  23. int* removeFila(Fila *F);
  24. void cria(int L[N][N]);
  25. void exibe(int L[N][N]);
  26. void anota(int L[N][N]);
  27. void extrai(int L[N][N]);
  28. /*Funcao main*/
  29. int main(){
  30.   int L[N][N];
  31.   char r;
  32.   srand(time(NULL));
  33.  
  34. do{
  35.     system("clear");
  36.     cria(L);
  37.    
  38.     anota(L);
  39.     extrai(L);
  40.     printf("Deseja continuar? (s/n)\n");
  41.     scanf("%c%*c", &r);
  42.   }
  43.   while(toupper(r) != 'N');
  44.   return 0;
  45. }/*fim-main*/
  46. /*inicializa a fila com o primeiro = ultimo elemento*/
  47. void fila_cria(Fila* f){
  48.   f->fim = 0;
  49.   f->inicio = 0;
  50. }
  51. int fila_vazia(Fila* f){
  52.   return (f->inicio >= f->fim);
  53. }
  54. /*funcao para inserir um elemento do tipo titem na fila*/
  55. void insereFila(titem x, titem y, Fila *F) {
  56.   if( F->fim == MAX ){
  57.     printf("Overflow\n"); /* O fim chegou a ultima posiçao do vetor*/
  58.     exit(1);
  59.   }
  60.   else{
  61.     F->elementosX[F->fim] = x;
  62.     F->elementosY[F->fim] = y;
  63.     (F->fim)++;
  64.   }
  65. }
  66. /*remove um elemento da fila*/
  67. int* removeFila(Fila *F) {
  68.   int* aux = (int*) malloc(sizeof(int)*2);
  69.  
  70.   if(F->inicio == F->fim){
  71.     printf("Vazia\n");
  72.     exit(1);
  73.   }
  74.   aux[0] = F->elementosX[F->inicio];
  75.   aux[1] = F->elementosY[F->inicio];
  76.   (F->inicio)++;
  77.   /* teste para check se o novo inicio passou do fim*/
  78.   if (F->inicio == (F->fim + 1) % MAX)
  79.      printf("O novo inicio passou do fim\n");
  80.   return aux;
  81. }
  82. /*cria a matriz do labirinto*/
  83. void cria(int L[N][N]){
  84.   int i, j;
  85.   for(i=0; i < N; i++){
  86.     L[i][0] = PAREDE;
  87.     L[i][N-1] = PAREDE;
  88.   }
  89.   for(j=0; j < N; j++){
  90.     L[0][j] = (PAREDE-2);
  91.     L[N-1][j] = (PAREDE-2);
  92.   }
  93.   for(i=1; i<N-1; i++){
  94.     for(j=1; j<N-1; j++){
  95.       if (rand()%3 == 0)
  96.         L[i][j] = (PAREDE-3);
  97.       else
  98.         L[i][j] = LIVRE;
  99.     }
  100.   } L[1][0] = LIVRE;
  101.     L[1][1] = LIVRE;
  102.     L[N-2][N-1] = LIVRE;
  103.     L[N-2][N-2] = LIVRE;
  104. } /*fim-cria*/
  105. /*exibe o labirinto criado*/
  106. void exibe(int L[N][N]){
  107.   int i, j;
  108.   for(i = 0; i< N; i++){
  109.     for(j = 0; j<N; j++){
  110.      
  111.       //if(i == 1 && j == 0) putchar('I');
  112.       if(i == N-2 && j == N-1) putchar('F');
  113.       switch(L[i][j]){
  114.         case LIVRE:
  115.           putchar(' ');
  116.           break;
  117.         case PAREDE:
  118.           putchar('|');
  119.           break;
  120.         case -1:
  121.           printf(RED "." RESET);
  122.           break;
  123.         case (PAREDE-2):
  124.           putchar('-');
  125.           break;
  126.         case (PAREDE-3):
  127.           printf(GRN "#" RESET);
  128.           break;
  129.         default: printf(" ");
  130.       }
  131.       putchar(' ');
  132.     }
  133.     printf("\n");
  134.   }
  135. }
  136. /*Funcao anota():
  137.   anota na matriz l um numero minimo de passos necessários para
  138.   atingir cada uma das posicoes do labirinto a partir da entrada
  139. */
  140. void anota(int L[N][N]){
  141.   int i,j, x, y;
  142.   int c;
  143.   Fila* F = (Fila*) malloc(sizeof(Fila));
  144.   int* aux;
  145.  
  146.   fila_cria(F);
  147.   i = j = 1;
  148.  
  149.   L[1][1] = 1;
  150.   insereFila(1, 1, F);
  151.  
  152.   while(!fila_vazia(F)){
  153.     aux = removeFila(F);
  154.     i = aux[0];
  155.     j = aux[1];
  156.     c = (L[i][j] + 1);
  157.     for(x=-1; x<=1; x++)
  158.       for(y=-1; y<=1; y++){
  159.         if(L[i + x][j + y] == 0 && (!x || !y)){
  160.           L[i + x][j + y] = c;
  161.           insereFila(i + x, j + y , F);
  162.         }
  163.       }
  164.   }
  165. }
  166. /* Funcao extrai():
  167.   Responsavel por apresentar o menor caminho a partir da funcao anotada utilizando a funcao anota() .
  168. */
  169. void extrai(int L[N][N]){
  170.   int x, y, i, j;
  171.   x = y = N - 2;
  172.   exibe(L);
  173.   while (L[N-2][N-2] == 0){
  174.     printf("Não Existe Saida para o labirinto.\n");
  175.     printf("Gerando Novo Labirinto: \n");
  176.     sleep(3);
  177.     cria(L);
  178.     exibe(L);
  179.     anota(L);
  180.   }
  181.   while(x != 1 && y != 1){
  182.     usleep(400000); exibe(L);
  183.     for( i= -1; i<= 1; i++)
  184.       for(j= -1; j<=1; j++){
  185.         if((!i || !j) && L[x+i][y+j] == L[x][y]-1){
  186.           L[x][y] = -1;
  187.           x += i;
  188.           y += j;
  189.         }
  190.       }
  191.   }
  192.   L[x][y] = -1;
  193.   L[1][1] = -1;
  194.   exibe(L);
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement