miguel747

Projeto4ED(amadeu e mandelson)

Nov 6th, 2011
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.88 KB | None | 0 0
  1. /*
  2.     Alunos: Mateus Mendelson Esteves da Silva e Amadeu Medina Borges
  3.     Matrículas: 11/0017579 e 10/0024157
  4.     Data de entrega: 06/11/2011
  5.     Estruturas de Dados, Turma E, Professor Díbio, 2º/2011
  6. */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9.  
  10. /* Estruturas */
  11. struct no{ //Estrutura para a árvore genérica (nó)
  12.        int info;
  13.        int lin;//Indica a linha no tabuleiro
  14.        int col;//Indica a coluna no tabuleiro
  15.        struct no *cima;//quadrado de cima
  16.        struct no *baixo;//quadrado de baixo
  17.        struct no *direita;//quadrado da direita
  18.        struct no *esquerda;//quadrado da esquerda     no tabuleiro
  19. };
  20. typedef struct no No;//No quer dizer Nó
  21.  
  22. ////////////////////////////////
  23.  
  24. /* Protótipos das funções */
  25. void libera_tabuleiro(int **, int);
  26.  
  27. void imprime_tabuleiro(int **, int);
  28.  
  29. void preenche_arvore_de_possibilidades(No *, int **, int, int *);
  30.  
  31. No *cria_no(int, int, int, No *, No *, No *, No *);
  32.  
  33. void libera_arvore_de_jogos(No *);
  34.  
  35. int buscar_o_no_final(No *, int , int **, int);
  36.  
  37. ///////////////////////////////////////////////////////////
  38.  
  39. /* Função principal */
  40. int main(){
  41.     FILE *fonte, *resultado;
  42.     int **tabuleiro;//'Alterar' indicará as posições que podem ser alteradas com 0. As que não podem, com 1
  43.     int x = 0;
  44.     int *confirmacao = &x;//Confirma se o tabuleiro tem solução( 0 quer dizer sem solução;  != 0 significa tem solução
  45.     int N, i, j;
  46.     int ii = -1, ji = -1; //Posição incial, ou seja, coordenada do número 1. (ii = linha incial; ji = coluna inicial)
  47.     No *r;//Raíz da árvore genérica (árvore de jogo). Ela será formada por todas as possibilidades de jogo.
  48.  
  49.     fonte = fopen("entradaProj4.txt", "r");
  50.  
  51.     if(fonte == NULL){
  52.              printf("Arquivo fonte nao encontrado!\n\n");
  53.              //system("PAUSE");
  54.              exit(1);
  55.     }
  56.  
  57.     fscanf(fonte, "%d", &N);
  58.  
  59.     if(N < 6 || N > 10){
  60.          printf("\n\nErro! O arquivo de entrada designa um tabuleiro ");
  61.          if(N <= 6){
  62.               printf("menor do que o minimo permitido!\n\n");
  63.          }else{
  64.                     printf("maior do que o maximo permitido!\n\n");
  65.          }
  66.          fclose(fonte);//Fechando o arquivo fonte
  67.          //system("PAUSE");
  68.          exit(2);
  69.     }
  70.  
  71.     //Iniciando e preenchendo o tabuleiro
  72.     tabuleiro = (int **) malloc(N*sizeof(int));
  73.  
  74.     for(i = 0; i < N; i++){
  75.           tabuleiro[i] = (int *) malloc(N*sizeof(int));
  76.     }
  77.  
  78.     //Preenchendo o tabuleiro
  79.     for(i = 0; i < N; i++){
  80.           for(j = 0; j < N; j++){
  81.                 fscanf(fonte, "%d", &tabuleiro[i][j]);
  82.           }
  83.     }
  84.  
  85.     //Fechando o arquivo fonte
  86.     fclose(fonte);
  87.  
  88.     //Imprimindo o tabuleiro inicial
  89.     printf("Tabuleiro inicial:\n\n");
  90.     imprime_tabuleiro(tabuleiro, N);
  91.     printf("\n");
  92.  
  93.     //Buscando a posição inicial
  94.     for(i = 0; i < N; i++){
  95.           for(j = 0; j < N; j++){
  96.                 if(tabuleiro[i][j] == 1){
  97.                                    ii = i;
  98.                                    ji = j;
  99.                 }
  100.           }
  101.     }
  102.  
  103.     if(ii == -1){
  104.           printf("\n\nErro! O tabuleiro nao possue posicao inicial! Encerrado!\n\n");
  105.           //system("PAUSE");
  106.           exit(3);
  107.     }
  108.  
  109.     r = cria_no(1, ii, ji, NULL, NULL, NULL, NULL);//Criando a raiz da árvore
  110.  
  111.     preenche_arvore_de_possibilidades(r, tabuleiro, N, confirmacao);//Preenche a árvore r, que se refere à jogadas de "tabuleiro" que possui N*N posições
  112.  
  113.     if(*confirmacao == 0){
  114.                     printf("\nO tabuleiro nao possui solucao!\n\n");
  115.  
  116.                     //Liberando estruturas
  117.                     libera_arvore_de_jogos(r);
  118.                     libera_tabuleiro(tabuleiro, N);
  119.                     free(confirmacao);
  120.  
  121.                     //system("PAUSE");
  122.                     exit(4);
  123.     }
  124.  
  125.     x = buscar_o_no_final(r, N, tabuleiro, 0);
  126.  
  127.     //Imprimindo a solução do tabuleiro
  128.     printf("\nSolução:\n\n");
  129.     imprime_tabuleiro(tabuleiro, N);
  130.     printf("\n");
  131.  
  132.     //Salvando a solução no arquivo de texto
  133.     resultado = fopen("solucaoProj4.txt", "w");//Criando o arquivo
  134.  
  135.     for(i = 0; i < N; i++){
  136.           for(j = 0; j < N; j++){
  137.                 fprintf(resultado, "%d ", tabuleiro[i][j]);
  138.           }
  139.           printf("\n");
  140.     }
  141.  
  142.     //Fechando o arquivo
  143.     fclose(resultado);
  144.  
  145.     //Liberando estruturas
  146.     libera_arvore_de_jogos(r);
  147.     libera_tabuleiro(tabuleiro, N);
  148.     free(confirmacao);
  149.  
  150.     //system("PAUSE");
  151.     return 0;
  152. }
  153. ////////////////////////////////////////////////////////////////
  154.  
  155. //Corpo das funções
  156.  
  157. //Função que imprime o tabuleiro
  158. void imprime_tabuleiro(int **tabuleiro, int t){
  159.      int i, j;
  160.  
  161.      for(i = 0; i < t; i++){
  162.           for(j = 0; j < t; j++){
  163.                 printf("%d ", tabuleiro[i][j]);
  164.           }
  165.           printf("\n");
  166.     }
  167. }
  168.  
  169. //Função que libera o tabuleiro
  170. void libera_tabuleiro(int **p, int t){
  171.      int i;
  172.  
  173.      for(i = 0; i < t; i++){
  174.            free(p[i]); //Liberando as linhas da matriz
  175.      }
  176.      free(p); //Liberando a matriz
  177. }
  178.  
  179. //Função que libera a árvore de jogo
  180. void libera_arvore_de_jogos(No *arvore_jogo){
  181.      No *p = arvore_jogo;
  182.  
  183.      if(p->cima == NULL && p->baixo == NULL && p->direita == NULL && p->esquerda == NULL){
  184.                 free(p);
  185.      }else if(p->cima != NULL){
  186.            libera_arvore_de_jogos(p->cima);
  187.      }else if(p->baixo != NULL){
  188.            libera_arvore_de_jogos(p->baixo);
  189.      }else if(p->direita != NULL){
  190.            libera_arvore_de_jogos(p->direita);
  191.      }else if(p->esquerda != NULL){
  192.            libera_arvore_de_jogos(p->esquerda);
  193.      }
  194. }
  195.  
  196.  
  197.  
  198. void preenche_arvore_de_possibilidades(No *r, int **tabuleiro, int N, int *confirmacao){ //Já que a posição inicial já é fornecida (de acordo com o roteiro do projeto) não nos preocuparemos com os casos em que o tabuleiro inicial não possui o número 1 (que é a posição inicial)
  199.    int i = r->lin, j = r->col;
  200.    int apoio;
  201.    int x;
  202.  
  203.    if(r->info == N*N){
  204.               x = r->info;//Checagem para saber se o último número foi colocado no tabuleiro, ou seja, se há solução
  205.               *confirmacao = x;
  206.    }
  207.  
  208.    if(r->info < N*N && r != NULL){//Checa se já preenchemos a árvore com todos os números e se o nó é um nó terminal (ou inválido)
  209.  
  210.              if((j + 1 < N) && tabuleiro[i][j + 1] == 0 || tabuleiro[i][j + 1] == (r->info) + 1){
  211.                                 r->direita = cria_no((r->info) + 1 /* número seguinte no tabuleiro */, i, j + 1, NULL, NULL, NULL, NULL);
  212.  
  213.                                 apoio = tabuleiro[i][j + 1];//Armazenamos o valor inicial nessa coordenada
  214.                                 tabuleiro[i][j + 1] = (r->info) + 1;//Alteramos temporariamente o valor nessa coordenada, para evitar que utilizemos duas vezes o mesmo quadrado na montagem da árvore
  215.                                 //printf("\n%d\t%d\t%d\n", r->info, r->lin, r->col);
  216.                                 //system("PAUSE");
  217.                                 preenche_arvore_de_possibilidades(r->direita, tabuleiro, N, confirmacao);
  218.  
  219.                                 tabuleiro[i][j + 1] = apoio;//Recolocamos o valor original na posição do tabuleiro, para que nada seja alterado ao final
  220.              }
  221.              if((j - 1 >= 0) && (tabuleiro[i][j - 1] == 0 || tabuleiro[i][j - 1] == (r->info) + 1)){
  222.                                 if(j + 1 < N && tabuleiro[i][j + 1] == (r->info) + 1){//Só há um caminho possível
  223.                                 }else{
  224.                                       r->esquerda = cria_no((r->info) + 1 /* número seguinte no tabuleiro */, i, j - 1, NULL, NULL, NULL, NULL);
  225.  
  226.                                       apoio = tabuleiro[i][j - 1];//Armazenamos o valor inicial nessa coordenada coordenada
  227.                                       tabuleiro[i][j - 1] = (r->info) + 1;//Alteramos temporariamente o valor nessa coordenada, para evitar que utilizemos duas vezes o mesmo quadrado na montagem da árvore
  228.                                       //printf("\n%d\t%d\t%d\n", r->info, r->lin, r->col);
  229.                                       //system("PAUSE");
  230.                                       preenche_arvore_de_possibilidades(r->esquerda, tabuleiro, N, confirmacao);
  231.  
  232.                                       tabuleiro[i][j - 1] = apoio;//Recolocamos o valor original na posição do tabuleiro, para que nada seja alterado ao final
  233.                                 }
  234.              }
  235.              if((i + 1 < N) && (tabuleiro[i + 1][j] == 0 || tabuleiro[i + 1][j] == (r->info) + 1)){
  236.                              if((j + 1 < N && tabuleiro[i][j + 1] == (r->info) + 1) || (j - 1 >= 0 && tabuleiro[i][j - 1] == (r->info) + 1)){//Só há um caminho possível
  237.                              }else{
  238.                                    r->baixo = cria_no((r->info) + 1 /* número seguinte no tabuleiro */, i + 1, j, NULL, NULL, NULL, NULL);
  239.  
  240.                                    apoio = tabuleiro[i + 1][j];//Armazenamos o valor inicial nessa coordenada coordenada
  241.                                    tabuleiro[i + 1][j] = (r->info) + 1;//Alteramos temporariamente o valor nessa coordenada, para evitar que utilizemos duas vezes o mesmo quadrado na montagem da árvore
  242.                                    //printf("\n%d\t%d\t%d\n", r->info, r->lin, r->col);
  243.                                    //system("PAUSE");
  244.                                    preenche_arvore_de_possibilidades(r->baixo, tabuleiro, N, confirmacao);
  245.  
  246.                                    tabuleiro[i + 1][j] = apoio;//Recolocamos o valor original na posição do tabuleiro, para que nada seja alterado ao final
  247.                              }
  248.              }
  249.              if((i - 1 >= 0) && (tabuleiro[i - 1][j] == 0 || tabuleiro[i - 1][j] == (r->info) + 1)){
  250.                              if((j + 1 < N && tabuleiro[i][j + 1] == (r->info) + 1) ||(j - 1 >= 0 && tabuleiro[i][j - 1] == (r->info) + 1) || (i + 1 < N && tabuleiro[i + 1][j] == (r->info) + 1)){//Só há um caminho possível
  251.                              }else{
  252.                                    r->cima = cria_no((r->info) + 1 /* número seguinte no tabuleiro */, i - 1, j, NULL, NULL, NULL, NULL);
  253.  
  254.                                    apoio = tabuleiro[i - 1][j];//Armazenamos o valor inicial nessa coordenada coordenada
  255.                                    tabuleiro[i - 1][j] = (r->info) + 1;//Alteramos temporariamente o valor nessa coordenada, para evitar que utilizemos duas vezes o mesmo quadrado na montagem da árvore
  256.                                    //printf("\n%d\t%d\t%d\n", r->info, r->lin, r->col);
  257.                                    //system("PAUSE");
  258.                                    preenche_arvore_de_possibilidades(r->cima, tabuleiro, N, confirmacao);
  259.  
  260.                                    tabuleiro[i - 1][j] = apoio;//Recolocamos o valor original na posição do tabuleiro, para que nada seja alterado ao final
  261.                              }
  262.              }
  263.              //A última condição dos laços acima (if) serve para verificar se o ponto pertence ao tabuleiro
  264.    }
  265. }
  266.  
  267. //Função que apenas cria um nó
  268. No *cria_no(int numero /*Informação a ser armazenada no nó*/, int i/*linha da informação*/, int j /*Coluna da informaçao*/, No *Cima, No *Baixo, No *Direita, No *Esquerda){//4 últimos argumentos: indicam os nós que serão ligados ao novo nó
  269.                 No *p;
  270.  
  271.                 p = malloc(sizeof(No)); //Criando o nó
  272.  
  273.                 //Preenchendo o nó com as informações
  274.                 p->info = numero;
  275.                 p->lin = i;
  276.                 p->col = j;
  277.                 p->cima = Cima;
  278.                 p->baixo = Baixo;
  279.                 p->direita = Direita;
  280.                 p->esquerda = Esquerda;
  281.  
  282.                 return p; //Retornando o nó
  283. }
  284.  //Função que busca a solução correta na árvore e preenche o tabuleiro
  285. int buscar_o_no_final(No *r, int N, int **tabuleiro, int x){
  286.  
  287.       if(x == 0){//Indica que ainda não encontramos o nó final
  288.            if((r->info != N*N) && (r != NULL)){
  289.                       tabuleiro[r->lin][r->col] = r->info;
  290.  
  291.                       if(x == 0){
  292.                            x = buscar_o_no_final(r->direita, N, tabuleiro, x);
  293.                       }
  294.                       if(x == 0){
  295.                            x = buscar_o_no_final(r->esquerda, N, tabuleiro, x);
  296.                       }
  297.                       if(x == 0){
  298.                            x = buscar_o_no_final(r->baixo, N, tabuleiro, x);
  299.                       }
  300.                       if(x == 0){
  301.                            x = buscar_o_no_final(r->cima, N, tabuleiro, x);
  302.                       }
  303.  
  304.            }else if(r->info == N*N){
  305.                  tabuleiro[r->lin][r->col] = r->info;//último elemento do tabuleiro. Encontramos o nó final!
  306.                  return 1;//Opa, indicamos que o final foi encontrado e que já podemos encerrar a função!
  307.            }
  308.       }
  309.       return 1;
  310.  }
Advertisement
Add Comment
Please, Sign In to add comment