Esempio n. 1
0
void novoFinal(node* Fila)
{
    node* novoItem = (node*) malloc(sizeof(node));
    if(!novoItem)
    {
        puts("\nNão há memória suficiente!");
        exit(1);
    }
    else
    {
        printf("\nInsira o número: ");  scanf("%d", &novoItem->num);
        if(vazia(Fila))
            Fila->prox = novoItem;
        else
        {
            node* tmp = Fila->prox;
            while(tmp->prox != NULL)
                tmp = tmp->prox;
            tmp->prox = novoItem;
        }
    }
}
Esempio n. 2
0
int retirar (TFila *fila){
	PEDIDO elemento;
	int i;
	if (!vazia(*fila)){
		elemento = fila->vetFila[fila->inicio];
		printf("****Elemento Retirado****\n");
		printf("Nome da Instituição: %s\n", elemento.Nome);
		printf("Tipo de Reparo: %d\n", elemento.TipoReparo);
		printf("Numero do protocolo: %d\n\n", elemento.Protocolo);
		for (i = 0; i < fila->fim - 1; i++)
		{
			fila->vetFila[i] = fila->vetFila[i+1];
		}
		fila->fim--;
		fila->contador--;
		return 	1;	
	}
	else{
		 printf("fila cheia");
		 return -1;
	}
}
Esempio n. 3
0
void exibe(no_t *p,aluno_t *y)
{
	if(vazia(p))
    {
		printf("Lista vazia!\n\n");
	}
	if(y->prox==NULL)
        printf("Lista vazia!\n\n");

	no_t *tmp;
	aluno_t *tmp1;

	tmp = p->prox;
    tmp1 = y->prox;
	while(tmp != NULL && tmp1 != NULL)
    {
		printf("%s: %.2f",tmp1->nome,tmp->nota);
		tmp = tmp->prox;
		tmp1=tmp1->prox;
		printf("\n");
	}

}
Esempio n. 4
0
File: largura.c Progetto: junin17/C
void bfs(grafo *g,int s,Fila *f){
    int u,i;
    g->cor[s]=cinza;
    g->dist[s]=0;
    esvazia(f);
    insere(f,s);

    while(!vazia(f)){
       u=retira(f);
       for(i=0;i<g->tam;i++){
            if(g->A[u][i]!=0 && g->cor[i]==branco){
                g->cor[i]=cinza;
                g->dist[i]=g->dist[u]+1;
                g->pred[i]=u;
                insere(f,i);
            }
       }

       g->cor[u]=preto;

    }

}
Esempio n. 5
0
void insereFim(Categoria *listCat)
{
	Categoria *novo=(Categoria *) malloc(sizeof(Categoria));
	if(!novo){
		printf("Sem memoria disponivel!\n");
		exit(1);
	}
	//preenche categoria
	cadCategoria(novo);
	
	novo->proximo = NULL;
	
	if(vazia(listCat))
		listCat->proximo=novo;
	else{
		Categoria *tmp = listCat->proximo;
		
		while(tmp->proximo != NULL)
			tmp = tmp->proximo;
		
		tmp->proximo = novo;
	}
}
Esempio n. 6
0
int remover_item(LISTA_LIGADA *lista, int chave) {
  if(lista != NULL) {
    if(!vazia(lista)) {
      NO *paux = lista->sentinela;

      while(paux->proximo->item->chave != chave) {
	paux = paux->proximo;
      }

      if(paux != lista->sentinela) {
	NO *prem = paux->proximo;
	paux->proximo = prem->proximo;

	if(prem == lista->fim) lista->fim = paux;

	apagar_no(prem);
	lista->tamanho--;
	return 1;
      }
    }
  }
  return 0;
}
Esempio n. 7
0
int preenche(int i, int j, int k)
{
  int l, t;

  ini = fim = 0;
  insere(i,j);

  t = 0;
  comp[i][j] = k;
  while(!vazia()){
    retira(&i, &j);
    t++;

    /*fprintf(stderr, "Visitei %d %d\n", i, j);*/
    l = castelo[i][j];
    if(l % 2 == 0 && comp[i][j-1] == 0){
      comp[i][j-1] = k;
      insere(i, j-1);
    }
    l = l >> 1;
    if(l % 2 == 0 && comp[i-1][j] == 0){
      comp[i-1][j] = k;
      insere(i-1, j);
    }
    l = l >> 1;
    if(l % 2 == 0 && comp[i][j+1] == 0){
      comp[i][j+1] = k;
      insere(i, j+1);
    }
    l = l >> 1;
    if(l % 2 == 0 && comp[i+1][j] == 0){
      comp[i+1][j] = k;
      insere(i+1, j);
    }
  }
  return t;
}
//Nome: MatrizAdjacenciaBuscaProfund
//Função: Realiza uma busca em profundidade em um grafo a partir de um nó, para descobrir se é conexo
//Entrada: Ponteiro para a estrutura de um grafo, nó inicial
//Saída: Retorna TRUE se o grafo é conexo e FALSE caso contrário
int MatrizAdjacenciaBuscaProfund(GrafoAdj *grafo, int valor){
    int marca = 1;
    int i, no;
    int compConex = FALSE;
    Pilha *p = cria();
    visitados = (int*) malloc(sizeof(int) * grafo->vertices);
    for (i = 0; i < grafo->vertices; i++) visitados[i] = 0;

    visitados[valor-1] = marca;
    empilha(p, valor-1);

    //while (compConex == TRUE){
        while (!vazia(p)){
            no = desempilha(p);
            visitados[no] = marca;
            for (i = 0; i < grafo->vertices; i++){
                if (grafo->matrizAdj[no][i] != 0){
                    if(visitados[i] == 0)
                        empilha(p, i);
                }
            }
        }
        compConex = TRUE;
        //marca++;
        for (i = 0; i < grafo->vertices; i++){
            if (visitados[i] == 0) {
                compConex = FALSE;
                break;
            }
        }
        //if (compConex == TRUE) empilha(p, i);
    //}
    free(visitados);
    destroi(p);
    return compConex;
}
Esempio n. 9
0
//Exibe Pilha
void exibe(tpilha *PILHA)
{
 if(vazia(PILHA)){
  printf("\nPilha vazia!\n\n");
  return ;
 }

 tpilha *aux;
 aux = PILHA->prox;
 system("cls");
 printf("PILHA:\n");

 printf("-----------------------------------------------------------------\n");
 printf("||                                                             ||\n");
 printf("||");
 while( aux != NULL){
  printf("%d", aux->num);
  if(aux->prox!=NULL)printf(", ");
  else printf(" ->");
  aux = aux->prox;
 }
 printf("\n||                                                             ||\n");
 printf("-----------------------------------------------------------------\n");


 /*printf("\n        ");
 int count;
 for(count=0 ; count < tam ; count++)
  printf("  ^  ");
 printf("\nOrdem:");
 for(count=0 ; count < tam ; count++)
  printf("%5d", count+1); */


 printf("\n\n");
}
Esempio n. 10
0
void insere(apontador local, tipoItem item, tipoLista* lista){


   if(lista->tamanho <= 1024){
       if(vazia(*lista)){
       apontador aux = (apontador)malloc(sizeof(celula));
       aux->item = item;
       lista->primeiro->prox = aux;
       aux->anterior = lista->primeiro;
       lista->ultimo = aux;
       aux->prox = NULL;
       }


       else if(local == NULL){
       apontador aux = (apontador)malloc(sizeof(celula));
       aux->item = item;
       aux->anterior = lista->ultimo;
       lista->ultimo->prox = aux;
       lista->ultimo = aux;
       aux->prox = NULL;
       }


        else{
        apontador aux = (apontador)malloc(sizeof(celula));
        aux->item = item;
        aux->prox = local;
        local->anterior->prox = aux;
        aux->anterior = local->anterior;
        local->anterior = aux;
        }
    lista->tamanho++;
    }

}
Esempio n. 11
0
//proc. que insere no----------------------------------------------------------------------------------
parvore insere_no(parvore *raiz, tcod cod) {
				parvore ant, atual;

				if (vazia(*raiz)) {
							*raiz = cria_no(cod);
							(*raiz) -> pai = NULL; // a raiz da arvore possui "pai = NULL "
							return((*raiz));
				}
				else {
								atual = (*raiz);
								while (atual != NULL) {
											if (cod == atual -> cod) {
													printf(" O valor e chave ja existe na arvore ");
													return (NULL);
											}
											 else {
															ant = atual;
															if (maior(atual -> cod, cod))
																	atual = atual -> esq;
															else
																	atual = atual -> dir;
											 }
								 }
								 if ( maior(ant -> cod, cod) ) {
												ant -> esq = cria_no(cod);
												ant -> esq -> pai = ant;
												return ( ant -> esq);
								 }
								 else {
												ant -> dir = cria_no(cod);
												ant -> dir -> pai = ant;
												return (ant -> dir);
								 }

				}
 }
Esempio n. 12
0
/**
 * Calcula média de acessos as chaves inseridas
 */
void media_acessos() {
    float count_jumps = 0, qtd_chaves = 0;
    //    int count_jumps = 0, qtd_chaves = 0;
    node *LISTA = (node *) malloc(sizeof (node));
    if (!LISTA) {
        exit(1);
    } else {
        inicia(LISTA);
    }
    if ((arquivo_hashing = fopen(ARQUIVO, "rb+")) == NULL) {
        printf("\nErro ao abrir arquivo!");
        return;
    }
    //    int i;
    // contar as chaves inseridas, salvar em uma lista e consultar até o final da lista
    for (int i = 0; i < TAMANHO_ARQUIVO; i++) {

        fseek(arquivo_hashing, ((i + 1) * sizeof (struct REGISTRO)), SEEK_SET);
        fread(&tabela_h, sizeof (struct REGISTRO), 1, arquivo_hashing);
        // insere todas as chaves do arquivo na lista
        if (tabela_h.chave != -1) {
            insereFim(LISTA, tabela_h.chave, tabela_h.nome, tabela_h.idade);
            qtd_chaves++;
        }
    }
    if (vazia(LISTA)) {

        //        return;
    }
    node *tmp;
    tmp = LISTA->prox;

    //loop para contar os acessos
    while (tmp != NULL) {
        int indice_elemento = consultar(tmp->chave, 1);
        int exit = 0;
        //         retirar depois
        //        printf("Chave: %d %s %d\n", tmp->chave, tmp->nome, tmp->idade);


        // consultar todos os pais
        while (exit == 0) {
            fseek(arquivo_hashing, (indice_elemento + 1) * sizeof (struct REGISTRO), SEEK_SET);
            fread(&tabela_h, sizeof (struct REGISTRO), 1, arquivo_hashing);

            //            fprintf(stderr, "jumps %f\n", count_jumps);
            //saída do loop dos pais 
            if (tabela_h.index_father == -1) {
                exit = 1;
                //                fprintf(stderr, "cj %d", count_jumps);
            } else
                indice_elemento = tabela_h.index_father;
            // incrementa contador
            count_jumps++;
        }
        // seleciona próximo da lista
        tmp = tmp->prox;
    }

    if (qtd_chaves != 0) {
        float media_acessos = count_jumps / qtd_chaves;
        fprintf(stderr, "%.1f", media_acessos);
    } else {
        fprintf(stderr, "0.0");
    }


    // media = acessos / TAMANHO_ARQUIVO
    fclose(arquivo_hashing);
}
Esempio n. 13
0
bool pop(stFila *qual)
{
	if (vazia(*qual)) return false;
	qual->inicio++;
	return true;
}
int analisadorSintatico(FILE* codigo, char** TABGRAFO, char*** TABT, char*** TABNT, char*** ANASIN, int linhasTabNT, int** automato, Hash tab, FILE* tabVar, Hash tabProc){

	char nomeArquivo[20];

	int* flag1 = (int *)malloc(sizeof(int));;
	*flag1 = 0;
	FILE* codigoIntermediario;
	//Inicializa as Pilhas
	Pilha* cadeia = inicializarPilha(cadeia);
	Pilha* naoTerminais = inicializarPilha(naoTerminais);
	push(naoTerminais,"progrm",10,0);

	char* cadCaracteres = (char *)malloc(50*sizeof(char));
	char* cadTerminais = (char *)malloc(50*sizeof(char));
	char* p = (char *)malloc(50*sizeof(char));

	//Isso sera alterado quando comecarmos a ler strings ao inves de caracteres
	char* caracter = (char *)malloc(50*sizeof(char));
	int numeroLinha = 0;
	int aux=0;
	int aux2=0;
	int flag = 0;
	char** vetor = (char **)malloc(4*sizeof(char *));
	int i;
	for(i=0;i<4;i++){
		vetor[i] = (char *)malloc(20*sizeof(char));
	}
	
	int* posicaoArquivo = (int *)malloc(sizeof(int));
	int* linhaArquivo = (int *)malloc(sizeof(int));
	*linhaArquivo = 1;
	*posicaoArquivo = 0;
	while(executaAnalisador(codigo, automato, 34, 7, tab, posicaoArquivo, vetor, tabProc, variaveis, linhaArquivo)) {
		
		strcpy(caracter, vetor[1]);
		printf("\n\nLinha %d | Lexema: \"%s\"\n", aux+1, caracter);

		if(aux==-1){
			printf("\n\n!! Cadeia nao aceita !!\n\n\n");
			//printf("\n\nErro na linha %d\n\n",*linhaArquivo);
			return 0;
		}
		while(1){
			// para aux == -2 
			while(aux==-2 && !vaziaNTerminais(naoTerminais)){
				//imprimirPilha(naoTerminais);
				aux = atoi(ANASIN[buscaNoTopo(naoTerminais)][4])-1;
				printf("Voltando para linha %d.\n", aux+1);

				if(aux==-1) aux = -2;
				if(aux!=-2){
					while(aux!=-1 && strcmp(ANASIN[aux][1],caracter)!=0){ //Verifica os nos alternativos para procurar o caracter
						aux = atoi(ANASIN[aux][3])-1;
						printf("Voltando novamente, para linha %d.\n", aux+1);

						// trick para tratar alternativo igual a -1
						if(aux==-2) aux = -1;
					}
					if(aux==-1) aux = -2;
				}
				
				// printf("%s\n",caracter);
				// printf("O Nao Terminal abaixo eh pai de: ");
				// imprimePilhaPosicaoAteTopo(cadeia, buscaPosicaoReconhecida(naoTerminais));
				desempilhaDaPosicaoAteTopo(cadeia,buscaPosicaoReconhecida(naoTerminais)); //Adicionar uma especie de fila aqui
				strcpy(p, pop(naoTerminais));
				push(cadeia,p,0,0);
				// printf("Desempilha o nao terminal %s\n",p);
			}
			if(vaziaNTerminais(naoTerminais) && aux==-2){
				printf("\n\n!! Cadeia nao aceita !!\n\n\n");
				// printf("Linha %d - Lexema \"%s\" encontrado.\n", numeroLinha, caracter);
				return 0;
			}
			// Para um Terminal encontrado
			if(strcmp(ANASIN[aux][0],"T")==0){
				// para caracter lido reconhecido
				if(strcmp(ANASIN[aux][1],caracter)==0){
					strcpy(cadCaracteres,ANASIN[aux][1]);
					push(cadeia,cadCaracteres,0,0); //Insere na pilha o caracter reconhecido
					aplicaAcoesSemanticas(codigoIntermediario, atoi(ANASIN[aux][5]),vetor, nomeArquivo, flag1);
					printf("TO AQUI %s\n",ANASIN[aux][5]);
					//imprimirPilha(cadeia);
					aux = atoi(ANASIN[aux][4])-1; //Aux recebe a linha correspondente ao sucessor do no encontrado
					printf("Lexema aceito. O sucessor é a linha: %d\n", aux+1);
					//printf("%s - %d\n", cadCaracteres, atoi(ANASIN[aux][5]));
					
					if(aux==-1) {
						aux=-2;
						printf("Linha sucessora é 0, ou seja, Chegamos ao fim dessa cadeia não terminal.\n");
					}
					break;
				}
				// para caracter não reconhecido
				else {
					aux = atoi(ANASIN[aux][3])-1; //Aux recebe a posicao do no alternativo
					
					//Caso nao haja mais nenhum no alternativo
					if(aux==-2){
						printf("\n\n!! Cadeia nao aceita !!\n\n\n");
						//printf("\n\nErro na linha %d\n\n",*linhaArquivo);
						return 0;
					}
					printf("Não reconhecido. Alternativo na linha: %d\n", aux+1);
				}
			}
			// para um não terminal encontrado
			else if(strcmp(ANASIN[aux][0],"N")==0){ //Encontra um Nao Terminal
				strcpy(cadTerminais,ANASIN[aux][1]);
				aplicaAcoesSemanticas(codigoIntermediario, atoi(ANASIN[aux][5]),vetor, nomeArquivo, flag1);
				push(naoTerminais,cadTerminais,atoi(ANASIN[aux][2])-1,topo(cadeia)); //Empilha o nao terminal na pilha de nao naoTerminais
				
				printf("Não terminal encontrado: \"%s\". Devemos empilha-lo.\n",cadTerminais);
				printf("Ao finalizar esse não terminal devemos voltar na linha: %d. ", atoi(ANASIN[aux][4]));

				aux = verificaLinhaTerminal(TABNT,linhasTabNT,cadTerminais); //Aux vai para a linha correspondente ao grafo do nao terminal
				printf("Vai para a linha: %d\n", aux+1);
				// imprimirPilha(naoTerminais);
			}
		}
		numeroLinha = aux;
		strcpy(vetor[0], "");
		strcpy(vetor[1], "");
		strcpy(vetor[2], "");



	}
	imprimirPilha(naoTerminais);
	while(!vazia(naoTerminais)){
		// printf("O Nao Terminal Abaixo é pai de: ");
		// imprimePilhaPosicaoAteTopo(cadeia, buscaPosicaoReconhecida(naoTerminais));
		desempilhaDaPosicaoAteTopo(cadeia,buscaPosicaoReconhecida(naoTerminais));
		strcpy(p,pop(naoTerminais));
		// printf("Desempilhando o %s\n",p);
		push(cadeia,p,0,0);
	}

	printf("\n\n!! Cadeia reconhecida !!\n\n\n");

	return 1;


}
Esempio n. 15
0
int main (){
	
	printf("Software de Fila Circular\n\n");
	printf("Para limpar a tela durante a execucao do programa, digite '9'\n\nPara alternar entre Fila Circular Simples e Merge, digite '0'\n\nPara limpar o Merge, digite '8'\n\n");
	printf("PRESSIONE ENTER");
	fflush(stdin);
	getchar();
	system("cls");
	
	//Decisão para Fila Circular simples ou Merge de 2 Filas Circulares
	
	int menu = 3;
	int tamanho;
	int decisao;
	int valor;
	int aux;
	
	while (menu != 1 && menu != 2){
		printf("1 - Fila Circular Simples\t 2 - Merge\tOpcao: ");
		scanf("%d", &menu);
		system("cls");
	}
	
	if (menu == 1){
		fila f;
		
		printf("Entre com o tamanho da fila: ");
		scanf("%d", &tamanho);
		
		criafila(&f, tamanho);
		system("cls");
		
		while (menu == 1){
			printf("\n");
			printf("1 - Inserir\t2 - Remover\t3 - Imprimir\n4 - Vazia\t5 - Cheia\tOpcao: ");
			scanf("%d", &decisao);
			
			//INICIO SWITCH
			switch(decisao){
				
				case 1:{
					
					if(cheia(&f) == 1){
						printf("\nFila Cheia\n");
					}
					else{
						printf("Inserir valor: ");
						scanf("%d", &valor);
						inserir(valor, &f);
					}
					break;
				}
				
				case 2:{
					
					
					if(vazia(&f) == 1)
						printf("\nFila Vazia\n");
					else{
						
						remove(&f);
						printf("\nRemovido\n");
					}
					break;
				}
				
				case 3:{
					
					if(vazia(&f) == 1)
						printf("\nFila Vazia\n");
					else{
						
						imprime(&f);
						
					}
					break;
				}
				
				case 4:{
					if(vazia(&f) == 1)
						printf("\nFila Vazia\n");
					else printf("\nFila Nao Vazia\n");
					break;
				}
				
				case 5:{
					if(cheia(&f) == 1)
						printf("\nFila Cheia\n");
					else printf("\nFila Nao Cheia\n");
					break;
				}
				
				case 0:{
					menu = 2;
					system("cls");
					break;
				}
				
				case 9:{
					system("cls");
					break;
				}
				
				
			}
			// FIM SWITCH
		}
		
		
	}
	int verifica = 0;
	while (menu == 2){
		
		fila f1, f2, merge;
		int tam1, tam2;
		int decfila = 3;
		
		if (verifica == 0){
			printf("Digite o tamanho da primeira fila: ");
			scanf("%d", &tam1);
			printf("Digite o tamanho da segunda fila: ");
			scanf("%d", &tam2);
		
			criafila(&f1, tam1);
			criafila(&f2, tam2);
			criafila(&merge, tam1 + tam2);
			verifica = 9;
		}
		
		while (decfila != 1 && decfila != 2){
			
			printf("Qual fila deseja modificar? ");
			scanf ("%d", &decfila);
		
		}
		
		while (decfila == 1){
			
			while(decfila == 1){
				
				printf("\n");
				printf("1 - Inserir\t2 - Remover\t3 - Imprimir\t4 - Vazia\n5 - Cheia\t6 - Mudar Fila\t7 - Merge\tOpcao: ");
				scanf("%d", &decisao);
			
				switch(decisao){
					
					case 1:{
						
						if(cheia(&f1) == 1){
							printf("\nFila Cheia\n");
						}
						else{
							printf("Inserir valor: ");
							scanf("%d", &valor);
							inserir(valor, &f1);
						}
						break;
					}
					
					case 2:{
						
						if(vazia(&f1) == 1)
							printf("\nFila Vazia\n");
						else{
							remove(&f1);
							printf("\nRemovido\n");
						}
						break;
					}
					
					case 3:{
						
						if(vazia(&f1) == 1)
							printf("\nFila Vazia\n");
						else{
							imprime(&f1);
						}
						break;
					}
					
					case 4:{
						
						if(vazia(&f1) == 1)
							printf("\nFila Vazia\n");
						else printf("\nFila Nao Vazia\n");
						break;
					}
					
					case 5:{
						
						if(cheia(&f1) == 1)
							printf("\nFila Cheia\n");
						else printf("\nFila Nao Cheia\n");
						break;
					}
					
					case 6:{
						decfila = 3;
						system("cls");
						while (decfila != 1 && decfila != 2){
							printf("Qual fila deseja modificar? ");
							scanf ("%d", &decfila);
						}
						system("cls");
						break;
					}
					
					case 7:{
						faz_merge(&f1, &f2, &merge);
						imprime(&merge);
						break;
					}
					
					case 8: {
						while(vazia(&merge) == 0){
							remove(&merge);
						}
						if(vazia(&merge)==1)
							printf("Merge Limpo");
						break;
					}
					case 9: {
						
						system("cls");
						break;
					}
					 
				}
		
		
				
			}
			
		}
		
		while(decfila == 2){
			
			while(decfila == 2){
				
				printf("\n");
				printf("1 - Inserir\t2 - Remover\t3 - Imprimir\t4 - Vazia\n5 - Cheia\t6 - Mudar Fila\t7 - Merge\tOpcao: ");
				scanf("%d", &decisao);
			
				switch(decisao){
					
					case 1:{
						
						if(cheia(&f2) == 1){
							printf("\nFila Cheia\n");
						}
						else{
							printf("Inserir valor: ");
							scanf("%d", &valor);
							inserir(valor, &f2);
						}
						break;
					}
					
					case 2:{
						
						if(vazia(&f2) == 1)
							printf("\nFila Vazia\n");
						else{
							remove(&f2);
							printf("\nRemovido\n");
						}
						break;
					}
					
					case 3:{
						
						if(vazia(&f2) == 1)
							printf("\nFila Vazia\n");
						else{
							imprime(&f2);
						}
						break;
					}
					
					case 4:{
						
						if(vazia(&f2) == 1)
							printf("\nFila Vazia\n");
						else printf("\nFila Nao Vazia\n");
						break;
					}
					
					case 5:{
						
						if(cheia(&f2) == 1)
							printf("\nFila Cheia\n");
						else printf("\nFila Nao Cheia\n");
						break;
					}
					
					case 6:{
						system("cls");
						decfila = 3;
						if (decfila != 1 && decfila != 2){
							printf("Qual fila deseja modificar? ");
							scanf ("%d", &decfila);
						}
						system("cls");
						break;
					}
					
					case 7:{
						faz_merge(&f1, &f2, &merge);
						imprime(&merge);
						break;
					}
					
					case 8:{
						while(vazia(&merge) == 0){
							remove(&merge);
						}
						if(vazia(&merge)==1)
							printf("Merge Limpo");
						break;
					}
					
					case 9: {
						
						system("cls");
						break;
					}
					 
				}
		
		
				
			}
			
		}
		
		
		
		
	}
	
	
	
	
	
	
	fflush(stdin);
	getchar();
	return 0;
}
Esempio n. 16
0
int main()
{
  int i, j;
  int infi;
  int max;


  FILE *fin = fopen("maze1.in", "r");
  FILE *fout = fopen("maze1.out", "w");

  int w, h;

  fscanf(fin, " %d %d", &w, &h);


  infi = 10000;

  for(i=0; i<2*h+1; i++){
    for(j=0; j<2*w+1; j++){
      do{
	labirinto[i][j] = getc(fin);
      }while(labirinto[i][j] == '\n');
      dist[i][j] = infi;
    }
  }

  ini = fim = 0;

  for(i=0; i<2*h+1; i++){
    if(labirinto[i][0] == ' '){
      dist[i][1] = 1;
      insere(i, 1);
    }
    if(labirinto[i][2*w] == ' '){
      dist[i][2*w-1] = 1;
      insere(i, 2*w-1);
    }
  }

  for(j=0; j<2*w+1; j++){
    if(labirinto[0][j] == ' '){
      dist[1][j] = 1;
      insere(1, j);
    }
    if(labirinto[2*h][j] == ' '){
      dist[2*h-1][j] = 1;
      insere(2*h-1, j);
    }
  }


  while(!vazia()){
    retira(&i, &j);

    if(i < 2*h-1 && labirinto[i+1][j] == ' ' && labirinto[i+2][j] == ' '
       && dist[i][j] + 1 < dist[i+2][j])
      {
	dist[i+2][j] = dist[i][j] + 1;
	insere(i+2, j);
      }

    if(i > 1  && labirinto[i-1][j] == ' ' && labirinto[i-2][j] == ' '
       && dist[i][j] + 1 < dist[i-2][j])
      {

	dist[i-2][j] = dist[i][j] + 1;
	insere(i-2, j);
      }

    if(j < 2*w-1 && labirinto[i][j+1] == ' ' && labirinto[i][j+2] == ' '
       && dist[i][j] + 1 < dist[i][j+2])
      {

	dist[i][j+2] = dist[i][j] + 1;
	insere(i, j+2);
      }

    if(j > 1  && labirinto[i][j-1] == ' ' && labirinto[i][j-2] == ' '
       && dist[i][j] + 1 < dist[i][j-2])
      {

	dist[i][j-2] = dist[i][j] + 1;
	insere(i, j-2);
      }
  }

  max = 0;
  for(i=0; i<2*h+1; i++){
    for(j=0; j<2*w+1; j++){
      if(dist[i][j] < infi && dist[i][j] > max)
	max = dist[i][j];
    }
  }


  fprintf(fout,"%d\n", max);


  return 0;
}