-
Notifications
You must be signed in to change notification settings - Fork 0
/
ambiente.c
86 lines (81 loc) · 2.68 KB
/
ambiente.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
#include "ambiente.h"
Ambiente* crearAmbiente (int n, int m, int** matrizInitial, Coordenadas* c_inicio, Coordenadas* c_objetivo){
int i;
int j;
Ambiente* a = (Ambiente*) malloc (sizeof (Ambiente));
a->m = m;
a->n = n;
a->matriz = malloc(n*sizeof(Nodo*));
for (i=0; i<n; i++){
a->matriz[i]=malloc(m*sizeof(Nodo));
}
for (i=0; i<n ; i++){
for(j=0; j<m ; j++){
if(matrizInitial[i][j] == 0){
a->matriz[i][j] = *crearNodo(i, j, true);
} else {
a->matriz[i][j] = *crearNodo(i, j, false);
}
}
}
a->inicio = &a->matriz[c_inicio->x][c_inicio->y];
a->objetivo = &a->matriz[c_objetivo->x][c_objetivo->y];
a->matriz[a->objetivo->x][a->objetivo->y].costo = 1;
if(n<=100 && m <= 100){
///Para las matrizes mas grandes esta funccion es demasiado compleja
//printf("\n Llamada de la funccion recursiva construirMatriz");
construirMatriz(a->matriz, n , m , a->objetivo, 2, i, j);
}
return a;
}
void construirMatriz (Nodo** matriz, int n, int m, Nodo* actual, int largo, int i, int j){
for(i = -1; i<=1; i++){
if(actual->x+i >= 0 && actual->x+i < n){
for(j=-1; j<=1 ; j++){
if(actual->y+j >= 0 &&
actual->y+j < m &&
!(j==0 && i==0) &&
matriz[actual->x+i][actual->y+j].libre
){
if(matriz[actual->x+i][actual->y+j].costo == -1 || matriz[actual->x+i][actual->y+j].costo > largo){
matriz[actual->x+i][actual->y+j].costo = largo;
construirMatriz(matriz, n, m, &matriz[actual->x+i][actual->y+j], largo+1, i, j);
}
}
}
}
}
}
bool dentroAmbiente(Ambiente* ambiente, int x, int y){
if(x >= ambiente->n || x < 0 || y >= ambiente->m || y < 0){
return false;
}
return true;
}
void visualizarAmbiente(Ambiente* ambiente){
printf("\n----------- Visializacion del ambiente ---------- \n");
printf("%d lineas, %d columnas \n\n", ambiente->n, ambiente->m);
int i;
int j;
for (i=0; i<ambiente->n; i++){
for(j=0; j<ambiente->m; j++){
if(j==0){
printf("\n");
}
if(ambiente->matriz[i][j].libre){
printf("%3d ", ambiente->matriz[i][j].costo);
} else {
printf(" - ");
}
}
}
}
void liberarAmbiente(Ambiente* ambiente){
int i;
for(i=0;i<ambiente->n;i++){
free(ambiente->matriz[i]);
}
free(ambiente->matriz);
free(ambiente);
ambiente = NULL;
}