-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMatriz.c
163 lines (148 loc) · 5.34 KB
/
Matriz.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "Matriz.h"
void alocarMatriz(char ***matrizTAD, Matriz matriz){
*matrizTAD = (char**)malloc(matriz.linhas*(sizeof(char*))); // Alocando linhas do tipo ponteiro
for(int i=0; i<matriz.linhas; i++){
(*matrizTAD)[i] = (char*)malloc(matriz.colunas*(sizeof(char))); // Alocando colunas do tipo inteiro
}
}
//Preenchendo a matriz solução
void preencherMatrizSolucao(Matriz matrizSolucao){
for(int i=0; i<matrizSolucao.linhas;i++){
for(int j=0;j<matrizSolucao.colunas;j++){
matrizSolucao.solucao[i][j] = '0';
}
}
}
//Preenchendo a matriz Labirinto. Aqui são usados os dados do arquivo.
void preencherMatrizLabirinto(FILE *arq, Matriz labirinto){
for(int i=0;i<labirinto.linhas;i++){
for(int j=0;j<labirinto.colunas;j++){
labirinto.labirinto[i][j] = fgetc(arq);
}
fgetc(arq);
}
}
//Liberando a matriz
void desalocarMatriz(char **matriz, int linhas) {
for (int i = 0; i < linhas; i++) {
free(matriz[i]);
}
free(matriz);
}
//
void mostrarMatriz(Matriz matriz, char **matrizEscolhida){
printf("\n");
for(int i =0; i<matriz.linhas; i++){
for(int j=0; j<matriz.colunas;j++){
printf("%c", matrizEscolhida[i][j]);
}
printf("\n");
}
}
//mostra a solução colorida
void mostrarCaminhoColorido(Matriz matriz, char **matrizEscolhida){
printf("\n");
for(int i =0; i<matriz.linhas; i++){
for(int j=0; j<matriz.colunas;j++){
if (matrizEscolhida[i][j] == '0'){ // se for 0, colocar amarelo
printf(YEL "%c", matrizEscolhida[i][j]);
printf(RESET);
}else if(matrizEscolhida[i][j] == 'S'){ // se for a posição do aluno, colocar vermelho
printf(RED "%c", matrizEscolhida[i][j]);
printf(RESET);
}else{ // se for o caminho feito pelo aluno, colocar verde
printf(GRN "%c", matrizEscolhida[i][j]);
printf(RESET);
}
}
printf("\n");
}
}
void posicaoEstudanteInicial(Matriz matriz, int *linha, int *coluna){
for(int i =0; i<matriz.linhas; i++){
for(int j=0; j<matriz.colunas;j++){
if(matriz.labirinto[i][j]=='0'){
*linha = i;
*coluna = j;
}
}
}
}
void posicaoEstudanteFinal(Matriz matriz, int *coluna){
for(int i =0; i<matriz.colunas; i++){
if(matriz.labirinto[0][i]=='0'){
*coluna = i;
}
}
}
int movimenta_estudante(Matriz *matriz, Pilha** pilha, int linha, int coluna){
if(MODOANALISE ==1){
char teste;
mostrarCaminhoColorido(*matriz, matriz->solucao);
printf("Linha: %d Coluna: %d Quantidade movimentos: %d", linha+1, coluna+1, matriz->qntMovimento);
scanf("%c", &teste); // Comente o comando caso queira observar o caminho em detalhes, a cada passo
}
// checa se a posicao pode ser visitada ou nao
// os indices da matriz devem estar entre (0,linhas-1) e (0,colunas-1)
// a solucao[linha][coluna] != 0 serve para garantir que essa posicao ja foi visitada
// labirinto[linha][coluna] == 2 serve para garantir que posicao é uma parede
// estudante encontrou uma porta e não possui chave para abri-la
if(linha<0 ||
coluna<0 ||
linha>=matriz->linhas ||
coluna>=matriz->colunas ||
matriz->solucao[linha][coluna] != '0' ||
matriz->labirinto[linha][coluna] == '2' ||
(matriz->labirinto[linha][coluna] =='3' && matriz->chave == 0))
{
return 0;
}else if(linha == 0){
matriz->colunaFinal = coluna;
matriz->solucao[linha][coluna] = 'S';
inserirPilha(&(*pilha), linha, coluna);
return 1;
}
// labirinto[linha][coluna] == 3 e chave == 1 garantem que o estudante pegue um atalho pela porta
if(matriz->chave >= 1 && matriz->labirinto[linha][coluna] =='3'){
matriz->solucao[linha][coluna] = 'P';
matriz->chave --;
}
// caso nao encontre saida pela porta ou normal o estudante precisa continuar
// percorrendo o labirinto ate esgotar todas as opcoes de percurso
// prioridade de movimento: descer, direita, subir, esquerda
// subir
matriz->solucao[linha][coluna] = '^';
matriz->qntMovimento++;
if(movimenta_estudante(matriz, pilha, linha-1, coluna)){
inserirPilha(&(*pilha), linha-1, coluna);
return 1;
}
// esquerda
matriz->qntMovimento++;
matriz->solucao[linha][coluna] = '<';
if(movimenta_estudante(matriz, pilha, linha, coluna-1)){
inserirPilha(&(*pilha), linha, coluna-1);
return 1;
}
// direita
matriz->solucao[linha][coluna] = '>';
matriz->qntMovimento++;
if(movimenta_estudante(matriz, pilha, linha, coluna+1)){
inserirPilha(&(*pilha), linha, coluna+1);
return 1;
}
// descer
matriz->solucao[linha][coluna] = 'V';
matriz->qntMovimento++;
if(movimenta_estudante(matriz, pilha, linha+1, coluna)){
inserirPilha(&(*pilha), linha+1, coluna);
return 1;
}
// labirinto[linha][coluna] == 3 o estudante recupera a chave que usou na linha 121
if(matriz->labirinto[linha][coluna] =='3'){
matriz->chave ++;
}
// caso nao seja mais possivel andar pela matriz
matriz -> solucao[linha][coluna] = '0';
return 0;
}