Skip to content
Snippets Groups Projects
Commit f0a4beae authored by Vytor Calixto's avatar Vytor Calixto :space_invader:
Browse files

Add função para calcular altura do grafo

parent d9771a17
Branches
No related tags found
1 merge request!2Altura
......@@ -26,6 +26,7 @@ No primeiroNoFilha(Filha f) {
}
No n = f->primeiro;
f->primeiro = getSucessorNo(f->primeiro);
--f->tamanho;
setSucessorNo(n, NULL);
setAntecessorNo(n, NULL);
return n;
......@@ -37,6 +38,7 @@ No ultimoNoFilha(Filha f) {
}
No n = f->ultimo;
f->ultimo = getAntecessorNo(f->ultimo);
--f->tamanho;
setSucessorNo(n, NULL);
setAntecessorNo(n, NULL);
return n;
......@@ -48,7 +50,14 @@ No insereFilha(void *conteudo, Filha f) {
if(!novo) return NULL;
setConteudo(novo, conteudo);
if(f->tamanho == 0) {
f->primeiro = novo;
}
setAntecessorNo(novo, f->ultimo);
setSucessorNo(f->ultimo, novo);
++f->tamanho;
return f->ultimo = novo;
}
......
......@@ -127,6 +127,36 @@ void floodFill(Tblr t, Vertice v, int i, int j){
return;
}
#include "filha.h"
void calculaAltura(Grafo g, Lista raiz) {
for(No n = primeiroNoLista(g->vertices); n; n = getSucessorNo(n)) {
Vertice v = (Vertice) getConteudo(n);
v->altura = -1;
}
Filha fila = constroiFilha();
for(No n = primeiroNoLista(raiz); n; n = getSucessorNo(n)) {
Vertice v = (Vertice) getConteudo(n);
v->altura = 0;
insereFilha(v, fila);
}
while(tamanhoFilha(fila) > 0) {
No n = primeiroNoFilha(fila);
if(!n) {
continue;
};
Vertice v = (Vertice) getConteudo(n);
for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) {
Vertice filho = (Vertice) getConteudo(m);
if(filho->altura == -1) {
filho->altura = v->altura+1;
insereFilha(filho, fila);
}
}
}
}
void destroiGrafo(Grafo g) {
destroiLista(g->vertices, destroiVertice);
free(g);
......@@ -144,10 +174,10 @@ void grafoParaDot(Grafo g, Lista grupo, FILE* fp) {
// Imprime o grafo
for(No n = primeiroNoLista(g->vertices); n; n = getSucessorNo(n)) {
Vertice pai = (Vertice) getConteudo(n);
fprintf(fp, "\t\"%p\" [label=\"cor=%d,peso=%d\"];\n", pai, pai->cor, pai->peso);
fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\naltura=%d\"];\n", pai, pai->cor, pai->peso, pai->altura);
for(No m = primeiroNoLista(pai->filhos); m; m = getSucessorNo(m)) {
Vertice filho = (Vertice) getConteudo(m);
fprintf(fp, "\t\"%p\" [label=\"cor=%d,peso=%d\"];\n", filho, filho->cor, filho->peso);
fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\naltura=%d\"];\n", filho, filho->cor, filho->peso, filho->altura);
fprintf(fp, "\t\"%p\" -- \"%p\";\n", pai, filho);
}
}
......
......@@ -19,6 +19,8 @@ void tabuleiroParaGrafo(Tblr t, Grafo g);
void floodFill(Tblr t, Vertice v, int i, int j);
void calculaAltura(Grafo g, Lista raiz);
void destroiGrafo(Grafo g);
void grafoParaDot(Grafo g, Lista grupo, FILE* fp);
......
......@@ -29,8 +29,12 @@ Lista Joga(Grafo g, Lista grupo){
for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) {
Vertice v = (Vertice) getConteudo(n);
// TODO: tratar empates!
if((v->peso + v->bonus) > (maior->peso + maior->bonus)) {
if((v->bonus) > (maior->bonus)) {
maior = v;
} else if(v->bonus == maior->bonus) {
if(v->peso > maior->peso) {
maior = v;
}
}
}
insereLista(maior->cor, jogadas);
......@@ -47,15 +51,16 @@ Lista Joga(Grafo g, Lista grupo){
destroiLista(filhos, NULL);
destroiLista(coresFilhos, destroiVertice);
// // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo
// char str[32];
// sprintf(str, "./jogada%d.out", counter );
// FILE* debug = fopen(str, "w+");
// if(debug) {
// grafoParaDot(g, grupo, debug);
// }
// fclose(debug);
// ++counter;
calculaAltura(g, grupo);
// PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo
char str[32];
sprintf(str, "./jogada%d.out", counter );
FILE* debug = fopen(str, "w+");
if(debug) {
grafoParaDot(g, grupo, debug);
}
fclose(debug);
++counter;
} while(tamanhoLista(grupo) < tamanhoLista(g->vertices));
return jogadas;
......
......@@ -15,18 +15,22 @@ No criaNo() {
}
No getSucessorNo(No n) {
if(!n) return NULL;
return n->proximo;
}
void setSucessorNo(No n, No p) {
if(!n) return;
n->proximo = p;
}
No getAntecessorNo(No n) {
if(!n) return NULL;
return n->anterior;
}
void setAntecessorNo(No n, No p) {
if(!n) return;
n->anterior = p;
}
......
......@@ -9,6 +9,7 @@ Vertice criaVertice() {
v->cor = -1;
v->peso = 0;
v->bonus = 0;
v->altura = -1;
v->grupo = false;
v->pais = constroiLista();
v->filhos = constroiLista();
......
......@@ -7,6 +7,7 @@ struct Vertice {
int cor;
int peso;
int bonus;
int altura;
bool grupo;
Lista pais;
Lista filhos;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment