All pastes #775810 Raw Edit

me.c

public c v1 · immutable
#775810 ·published 2007-11-15 19:00 UTC
rendered paste body
# include <stdio.h># include <stdlib.h># include "lablib.h"# include "pilhalib.h"void imprime_tabuleiro (struct tabuleiro *t){ int i, j;  printf("Labirinto:\n"); for (i=0; i<t->m_lin; i++)    {     for (j=0; j<t->n_col; j++)        printf("%c ", t->mat[i][j]);     printf("\n");    }}void inicia_tabuleiro (struct tabuleiro *t){ char nome_arq[25]; FILE *arq; char ch; int i,j;  	/* Abre arquivo para leitura */ printf("Digite o nome do arquivo a ser aberto:\n"); scanf("%s", nome_arq);  arq = fopen(nome_arq,"r"); if(arq == NULL)   {    printf("Arquivo não existente. Saindo...\n");    exit(1);	      }         /* Le labirinto do arquivo */        i=0; while ((ch=fgetc(arq)) != EOF)      {       j=0;       while ((ch=fgetc(arq)) != '\n')            {              if ((ch != '\n'))               t->mat[i][j]=ch;             j++;            }       i++;      }   /* Captura a ordem da matriz (MxN) */ t->m_lin=i; t->n_col=j;  /* Entrada e saida do labirinto */ t->entrada.x=1; t->entrada.y=0; t->saida.x= t->m_lin-2; t->saida.y= t->n_col-1;}struct pilha *acha_caminho (struct pilha *topo, struct tabuleiro *t){ struct coordenada atual;  atual.x= t->entrada.x; atual.y= t->entrada.y;	/* Verifica entrada do labirinto */  if (t->mat[atual.x][atual.y] == ' ')    empilha(topo, atual.x, atual.y); else     {      printf("Entrada de dados inconsistente.\nA entrada do labirinto deve ser em (1,0).\n");      exit(1);     }      do {     if (t->mat[atual.x][atual.y] == ' ')       { empilha(topo, atual.x, atual.y); printf("Empilhou %d %d\n",atual.x, atual.y );}     else       { desempilha(topo); printf("DESempilhou %d %d\n",atual.x, atual.y); }     switch (decide_direcao(t, atual.x, atual.y))          {           case 1: t->mat[atual.x][atual.y]= '.'; atual.x++; break;	// para baixo           case 2: t->mat[atual.x][atual.y]= '.'; atual.y++; break;	// para direita           case 3: t->mat[atual.x][atual.y]= '.'; atual.x--; break;	// para cima           case 4: t->mat[atual.x][atual.y]= '.'; atual.y--; break;	// para esquerda           case -1: break;           case -2: break;           case -3: break;           case -4: break;           case 0: break;           default: break;          }    } while ((atual.x != t->saida.x) || (atual.y != t->saida.y));  imprime_caminho(topo);}void imprime_caminho (struct pilha *topo){ if (pilha_vazia(topo))   printf("Naum ha conexao entre os pontos de entrada e saida do labirinto.\n"); else    {     struct pilha *p=topo;     do {           printf("(%d,%d) ",p->pos.x, p->pos.y);           p=p->prox;        }  while (p->prox != NULL);    }}int decide_direcao (struct tabuleiro *t, int lin, int col){ 	// para baixo if (t->mat[lin+1][col] == ' ')  return 1;	// para direita if (t->mat[lin][col+1] == ' ')  return 2;	// para cima if (t->mat[lin-1][col] == ' ')  return 3;	// para esquerda if (t->mat[lin][col-1] == ' ')  return 4;	// soh vai pra baixo if ((t->mat[lin+1][col] == ' ') && (t->mat[lin][col+1] != ' ') && (t->mat[lin-1][col] != ' ') &&  (t->mat[lin][col-1] != ' '))  return -1;  	// soh vai pra direita if ((t->mat[lin+1][col] != ' ') && (t->mat[lin][col+1] == ' ') && (t->mat[lin-1][col] != ' ') &&  (t->mat[lin][col-1] != ' '))  return -2;  	// soh vai pra cima if ((t->mat[lin+1][col] != ' ') && (t->mat[lin][col+1] != ' ') && (t->mat[lin-1][col] == ' ') &&  (t->mat[lin][col-1] != ' '))  return -3;	// soh vai pra esquerda if ((t->mat[lin+1][col] != ' ') && (t->mat[lin][col+1] != ' ') && (t->mat[lin-1][col] != ' ') &&  (t->mat[lin][col-1] == ' '))  return -4;  	// nao vai a lugar nenhum  if ((t->mat[lin+1][col] != ' ') && (t->mat[lin][col+1] != ' ') && (t->mat[lin-1][col] != ' ') &&  (t->mat[lin][col-1] != ' '))  return 0;}