-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathminmax.c
128 lines (119 loc) · 2.1 KB
/
minmax.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
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX INT_MAX
#define MIN INT_MIN
typedef struct tree{
int v;
struct tree **filhos;
int numf;
int depth;
}node;
void add_arvore(node **t);
int minmax(node *t,int alpha,int beta,int max);
int maximo(int a,int b);
int minimo(int a,int b);
void free_tree(node *t);
int main()
{
node *t,*teste;
t = NULL;
add_arvore(&t);
minmax(t,MIN,MAX,1);
free_tree(t);
return 0;
}
void add_arvore(node **t)
{
if(!(*t))
{
(*t) = (node *)malloc(sizeof(node));
(*t)->numf = 0;
(*t)->depth = 0;
(*t)->v = 0;
(*t)->filhos = NULL;
}
int valor;
scanf("%d",&valor);
while(valor != 0)
{
if(valor < 0)
{
(*t)->numf++;
if(!(*t)->filhos)
{
node **filhos;
filhos = (node **)malloc(sizeof(node));
(*t)->filhos = filhos;
}
else
(*t)->filhos = (node**)realloc((*t)->filhos,((*t)->numf+1)*sizeof(node));
node *son;
son = NULL;
add_arvore(&son);
(*t)->filhos[(*t)->numf-1] = son;
int max,i;
max = MIN;
for(i=0;i<(*t)->numf;i++)
if((*t)->filhos[i]->depth > max)
max = (*t)->filhos[i]->depth;
(*t)->depth = max+1;
}
else{
(*t)->v = valor;
break;
}
scanf("%d",&valor);
}
}
void free_tree(node *t)
{
if(t->filhos)
{
int i;
for(i=0;i<t->numf;i++)
free_tree(t->filhos[i]);
free(t->filhos);
}
free(t);
}
int minmax(node *t,int alpha,int beta,int max)
{
if(!t->depth)
return t->v;
int i;
if(max)
{
t->v = MIN;
for(i=0;i<t->numf;i++)
{
t->v = maximo(t->v,minmax(t->filhos[i],alpha,beta,0));
alpha = maximo(t->v,alpha);
printf("depth => %d // v value => %d // alpha value => %d // beta value => %d\n",t->depth,t->v,alpha,beta);
if(alpha >= beta)
break;
}
return t->v;
}
else
{
t->v = MAX;
for(i=0;i<t->numf;i++)
{
t->v = minimo(t->v,minmax(t->filhos[i],alpha,beta,1));
beta = minimo(t->v,beta);
printf("depth => %d // v value => %d // alpha value => %d // beta value => %d\n",t->depth,t->v,alpha,beta);
if(alpha >= beta)
break;
}
return t->v;
}
}
int maximo(int a,int b)
{
return a>=b? a:b;
}
int minimo(int a,int b)
{
return a<=b? a:b;
}