Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h> /*Definicao das cores pelo console*/ #define VERMELHO "\e[41m \e[49m" #define AZUL "\e[44m \e[49m" #define CIANO "\e[46m \e[49m" #define CINZA "\e[47m \e[49m" struct tnode{ char matriz [20]; char expandir; struct tnode *noPai; struct tnode *no1; struct tnode *no2; struct tnode *no3; struct tnode *no4; struct tnode *no5; struct tnode *no6; struct tnode *no7; struct tnode *no8; }; struct tnode1{ char matriz [20]; struct tnode *noPai; struct tnode *no1; }; /*declaracao da variavel da raiz da arvore*/ struct tnode *arvoresol; /*declaracao das funcoes utilizadas*/ void analise (struct tnode *arvoreroot,struct tnode *arvore,int AchouSolucao,FILE *pa); void addtree (struct tnode *arvore,char matrizTabuleiro[], char blnExpandir, int no); char* movimentosPosiveis (char matrizTabuleiro []); int varrerArvore(struct tnode *arvore,char matrizTabuleiro[]); void CaminhoSolucao(struct tnode *arvore,FILE *pa) ; void ImprimirTabuleiro21(char matrizTabuleiro[]); void imprimir (char matriz[]); /*Funcaoo principal do programa*/ int main () { int MAX=20; /*Configuracao da matriz inicial do jogo*/ char matrizTabuleiroInicial [20] = {'q','p','p','q','q','p','p','q','q','q','q','q','q','q','q','q','q','v','v','q'}; char linha[MAX]; FILE *pa; char *nome = "texto.txt"; struct tnode *arvoreroot; /*Seto o valor da variavel como nulo*/ arvoreroot = NULL; /*Adiciono a matriz inicial na arvore*/ addtree(arvoreroot,matrizTabuleiroInicial,'E',0); /* Abre o arquivo para leitura e escrita */ if (( pa = fopen(nome, "w+")) == NULL) { printf("\n\nNao foi possivel abrir o arquivo.\n"); exit(1); } /* chamo a funcao de analise da arvore*/ analise(arvoreroot,arvoreroot,1,pa); /*Leio cada linha do arquivo e mando imprimir-la*/ while (!feof(pa)) { fgets(linha, MAX, pa); ImprimirTabuleiro21(linha); sleep(1); } /*fecho o arquivo*/ fclose(pa); return 0; } /*Funcao de analise do programa*/ void analise (struct tnode *arvoreroot,struct tnode *arvore,int AchouSolucao,FILE *pa) { /* declaracao de variaveis*/ char matrizMovimentoPosiveis[20]; char matrizTabuleiro [20]; int i,count,retorno; /* Esquema da configuracao final do jogo para verificacao se o programa ja chegou na solucao*/ char matrizTabuleiroFinal [20] = {'q','q','q','q','q','q','q','q','q','p','p','q','q','p','p','q','q','v','v','q'}; /*inicializo a variavel do contador auxiliar; essa variavel indica o numero de possibilidades...*/ /* o count sao vai ate 8*/ count=0; /*memset (matrizMovimentoPosiveis,0,20);*/ if (arvore!=NULL) { /*verifico se a matriz eunica e se nao foi encontrada a solucao*/ if (arvore->expandir=='E' && AchouSolucao!=0) { /*copio a matriz do no para uma variavel*/ strcpy(matrizTabuleiro,arvore->matriz); /*Ando por todas as casas do tabuleiro procurando um espacao vazio*/ for (i=0;i<=19;i++) { /* verifico se achei um espacao vazio*/ if (matrizTabuleiro[i]=='v') { /*Testo as possibilidades de movimentos com os quadrados irmaos*/ if ((i-1)>=0) { if (matrizTabuleiro[i-1]=='q') { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i]='q'; matrizMovimentoPosiveis[i-1]='v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno = varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final*/ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if ((i+1)<=19) { if (matrizTabuleiro[i+1]=='q') { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecas*/ matrizMovimentoPosiveis[i]='q'; matrizMovimentoPosiveis[i+1]='v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno = varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final*/ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if ((i-4)>=0) { if (matrizTabuleiro[i-4]=='q') { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'q'; matrizMovimentoPosiveis[i-4] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno=varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final*/ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if ((i+4)<=19) { if (matrizTabuleiro[i+4]=='q') { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'q'; matrizMovimentoPosiveis[i+4] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno = varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final*/ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } /*Testo as possibilidades de movimentos com a princesa*/ if ((i+9)<=19) { if ((matrizTabuleiro[i+4]='p') && (matrizTabuleiro[i+1]='v') && (matrizTabuleiro[i+5]='p')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i+1] = 'p'; matrizMovimentoPosiveis[i+8] = 'v'; matrizMovimentoPosiveis[i+9] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno = varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final*/ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if (((i+8)<=19) && ((i-1)>=0)) { if ((matrizTabuleiro[i+4]='p') && (matrizTabuleiro[i-1]='v') && (matrizTabuleiro[i+3]='p')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i-1] = 'p'; matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i+7] = 'v'; matrizMovimentoPosiveis[i+8] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno = varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final*/ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if (((i-2)>=0) && ((i+4)<=19)) { if ((matrizTabuleiro[i-1]='p') && (matrizTabuleiro[i+3]='p') && (matrizTabuleiro[i+4]='v')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i+4] = 'p'; matrizMovimentoPosiveis[i+2] = 'v'; matrizMovimentoPosiveis[i-2] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno=varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final */ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if ((i-6)>=0) { if ((matrizTabuleiro[i-1]='p') && (matrizTabuleiro[i-5]='p') && (matrizTabuleiro[i-4]='v')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i-4] = 'p'; matrizMovimentoPosiveis[i-6] = 'v'; matrizMovimentoPosiveis[i-2] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno=varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final */ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if ((i-9)>=0) { if ((matrizTabuleiro[i-4]='p') && (matrizTabuleiro[i-5]='p') && (matrizTabuleiro[i-1]='v')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i-1] = 'p'; matrizMovimentoPosiveis[i-8] = 'v'; matrizMovimentoPosiveis[i-9] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno=varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final */ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if (((i-8)>=0) && ((i+1)<=19)) { if ((matrizTabuleiro[i-3]='p') && (matrizTabuleiro[i-4]='p') && (matrizTabuleiro[i+1]='v')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i+1] = 'p'; matrizMovimentoPosiveis[i-7] = 'v'; matrizMovimentoPosiveis[i-8] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno=varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final */ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if (((i-4)>=0) && ((i+2)<=19)) { if ((matrizTabuleiro[i+1]='p') && (matrizTabuleiro[i-3]='p') && (matrizTabuleiro[i-4]='v')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i-4] = 'p'; matrizMovimentoPosiveis[i+2] = 'v'; matrizMovimentoPosiveis[i-2] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno=varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final */ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } if ((i+6)<=19) { if ((matrizTabuleiro[i+1]='p') && (matrizTabuleiro[i+5]='p') && (matrizTabuleiro[i+4]='v')) { /*Se as condicoes forem satisfeita copio a matriz do no para uma variavel*/ strcpy(matrizMovimentoPosiveis, matrizTabuleiro); /*Movimento das pecaas*/ matrizMovimentoPosiveis[i] = 'p'; matrizMovimentoPosiveis[i+4] = 'p'; matrizMovimentoPosiveis[i+2] = 'v'; matrizMovimentoPosiveis[i] = 'v'; /*Chamo a funcao para verificar se aquela configuracao ja existe na arvore*/ retorno=varrerArvore(arvoreroot,matrizMovimentoPosiveis); /*verifico se ea solucao final */ AchouSolucao = strcmp (matrizMovimentoPosiveis,matrizTabuleiroFinal); /* guardo a configuracao da variavel na arvore com N se ela ja exitir - neste caso nao preciso expandir ela*/ if (retorno==0) { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'N',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'N',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'N',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'N',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'N',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'N',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'N',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'N',7);} } else { if (count==0) {addtree(arvore,matrizMovimentoPosiveis,'E',0);} if (count==1) {addtree(arvore,matrizMovimentoPosiveis,'E',1);} if (count==2) {addtree(arvore,matrizMovimentoPosiveis,'E',2);} if (count==3) {addtree(arvore,matrizMovimentoPosiveis,'E',3);} if (count==4) {addtree(arvore,matrizMovimentoPosiveis,'E',4);} if (count==5) {addtree(arvore,matrizMovimentoPosiveis,'E',5);} if (count==6) {addtree(arvore,matrizMovimentoPosiveis,'E',6);} if (count==7) {addtree(arvore,matrizMovimentoPosiveis,'E',7);} } /*verifico se a solucao e caso seja vou para a funcao que dara o caminho da solucao*/ if (AchouSolucao==0) { if (count==0) {CaminhoSolucao(arvore->no1,pa);} if (count==1) {CaminhoSolucao(arvore->no2,pa);} if (count==2) {CaminhoSolucao(arvore->no3,pa);} if (count==3) {CaminhoSolucao(arvore->no4,pa);} if (count==4) {CaminhoSolucao(arvore->no5,pa);} if (count==5) {CaminhoSolucao(arvore->no6,pa);} if (count==6) {CaminhoSolucao(arvore->no7,pa);} if (count==7) {CaminhoSolucao(arvore->no8,pa);} return; } /*Somo mais um na variavel */ count ++; } } } } if (AchouSolucao!=0) { analise(arvoreroot,arvore->no1,AchouSolucao,pa); analise(arvoreroot,arvore->no2,AchouSolucao,pa); analise(arvoreroot,arvore->no3,AchouSolucao,pa); analise(arvoreroot,arvore->no4,AchouSolucao,pa); analise(arvoreroot,arvore->no5,AchouSolucao,pa); analise(arvoreroot,arvore->no6,AchouSolucao,pa); analise(arvoreroot,arvore->no7,AchouSolucao,pa); analise(arvoreroot,arvore->no8,AchouSolucao,pa); } else return; } } } /* funcao recursiva para varrer a arvore*/ int varrerArvore(struct tnode *arvore,char matrizTabuleiro[]) { /* Variavel que indica se a matriz pesquisada ja se encontra na arvore, caso o resultado seja positivo a variavel sera igual a 0*/ int Matrizexistente=1; if (arvore!=NULL) { Matrizexistente = strcmp(arvore->matriz,matrizTabuleiro); if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no1,arvore->matriz); } if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no2,arvore->matriz); } if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no3,arvore->matriz); } if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no4,arvore->matriz); } if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no5,arvore->matriz); } if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no6,arvore->matriz); } if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no7,arvore->matriz); } if (Matrizexistente !=0) { Matrizexistente = varrerArvore(arvore->no8,arvore->matriz); } } return Matrizexistente; } /*funcao para criar um no e adicionar as informacoes*/ void addtree (struct tnode *arvore,char matrizTabuleiro[], char blnExpandir, int no) { if (arvore!=NULL) { arvore = (struct tnode *) malloc(sizeof(struct tnode)); /*Cria um novo no*/ strcpy(arvore->matriz, matrizTabuleiro); arvore->expandir = blnExpandir; arvore->noPai = NULL; arvore->no1=arvore->no2=arvore->no3=arvore->no4=arvore->no5=arvore->no6=arvore->no7=arvore->no8=NULL; } else { struct tnode *novo; novo = (struct tnode *) malloc(sizeof(struct tnode)); /*Cria um novo no*/ strcpy(novo->matriz, matrizTabuleiro); novo->expandir = blnExpandir; novo->noPai = arvore; novo->no1=novo->no2=novo->no3=novo->no4=novo->no5=novo->no6=novo->no7=novo->no8=NULL; if (no==0) {arvore->no1=novo;} if (no==1) {arvore->no2=novo;} if (no==2) {arvore->no3=novo;} if (no==3) {arvore->no4=novo;} if (no==4) {arvore->no5=novo;} if (no==5) {arvore->no6=novo;} if (no==6) {arvore->no7=novo;} if (no==7) {arvore->no8=novo;} } } void CaminhoSolucao(struct tnode *arvore,FILE *pa) { int i; if (arvore->noPai!=NULL) { /* escrevo a matriz no arquivo*/ fputs(arvore->matriz, pa); /* volto ao inicio do arquivo*/ rewind(pa); /*Seto o no pai e chamo a função recursivamente*/ CaminhoSolucao(arvore->noPai, pa); } } void ImprimirTabuleiro21(char matrizTabuleiro[]) { int i,j,ianterior; printf("\n"); for (i=0;i<=5;i++) { /*printf(AZUL);*/ printf("#"); } printf("\n"); for (i=0;i<=4;i++) { /*printf(AZUL);*/ printf("#"); for (j=ianterior;j<=ianterior+3;j++) { if (matrizTabuleiro[j] == 'q') printf("q"); /*printf(CIANO);*/ if (matrizTabuleiro[j] == 'v') printf("v"); /*printf(CINZA);*/ if (matrizTabuleiro[j] == 'p') printf("p"); /*printf(VERMELHO); */ } ianterior=j; /*printf(AZUL);*/ printf("#"); printf("\n"); } for (i=0;i<=5;i++) { if (i==2 || i==3) printf("v"); /*printf(CINZA);*/ else printf("#"); /*printf(AZUL);*/ } printf("\n"); sleep(1); /*Limpeza de tela...*/ printf("\e[H\e[2J"); } void imprimir (char matriz[]) { int i; for (i=0;i<=19;i++) printf("%c",matriz[i]); printf ("\n"); }
Compartilhar