diff --git a/libs/jogador.c b/libs/jogador.c index 33ab0538313d2432e7de0bb6fb28a302b8149ad7..f6824e6cdf0fad15bb3711c2433921e9e89ad3e5 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -17,11 +17,7 @@ Lista Joga(Grafo g, Lista grupo){ int altura = calculaAltura(g, grupo); int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); - int profundidade = 32; - if(altura > 10) { - profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); - if (profundidade <= 0) profundidade = 1; - } + int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); // Pega os filhos do grupo Lista filhos = filhosGrupo(grupo); @@ -31,7 +27,7 @@ Lista Joga(Grafo g, Lista grupo){ // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz // Só é necessário para calcular o bônus de cada filho // printf("\tJOGADA %d\n", counter); - Lista coresFilhos = agrupaCores(filhos, g, profundidade); + Lista coresFilhos = agrupaCores(filhos); // printf("\tAltura da árvore: %d\n", altura); // printf("\tNúmero de grupos: %d\n", tamanhoLista(g->vertices)); // printf("\tNúmero de grupos não consumidos: %d\n", tamanhoLista(g->vertices) - tamanhoLista(grupo)); @@ -56,18 +52,6 @@ Lista Joga(Grafo g, Lista grupo){ } else if((v->bonus) == (maior->bonus)) { if(v->peso > maior->peso) { maior = v; - } else if(v->peso == maior->peso) { - int maiorFilhoM = 0; - int maiorFilhoV = 0; - for(No m = primeiroNoLista(maior->filhos); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - if(w->altura > maiorFilhoM) maiorFilhoM = w->altura; - } - for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - if(w->altura > maiorFilhoV) maiorFilhoV = w->altura; - } - if(maiorFilhoV > maiorFilhoM) maior = v; } } } @@ -115,8 +99,7 @@ Lista filhosGrupo(Lista grupoPai) { return filhos; } -Lista agrupaCores(Lista vertices, Grafo g, int profundidade) { - if(profundidade < 0 ) return NULL; +Lista agrupaCores(Lista vertices) { Lista agrupa = constroiLista(); for(No n = primeiroNoLista(vertices); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); @@ -151,40 +134,22 @@ Lista agrupaCores(Lista vertices, Grafo g, int profundidade) { } } - // Depos do laço anterior, temos uma lista de vértices agrupados - // Então, agrupamos os filhos e calculamos os bônus - for(No n = primeiroNoLista(agrupa); n; n = getSucessorNo(n)) { - Vertice v = (Vertice) getConteudo(n); - Lista filhosAgrupa = agrupaCores(v->filhos, g, profundidade-1); - for(No m = primeiroNoLista(filhosAgrupa); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - // TODO: verificar se W não é sobrinho de V - // para não dar o bônus duas vezes - if(!w->grupo && (w->altura > v->altura) && !w->visitado){ - v->bonus += w->peso + w->bonus; - w->visitado = true; - } - } - for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - w->bonus = v->bonus; - } - destroiLista(filhosAgrupa, NULL); - } - return agrupa; } -int calculaBonus(Vertice v, Lista irmaos, int profundidade) { - int bonus = 0; - for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) { - Vertice filho = (Vertice) getConteudo(n); - // Se o filho não está na lista irmaos e não está no grupo de vértices já consumidos - if(!filho->grupo && !pertenceLista(filho, irmaos)) { - bonus += filho->peso + calculaBonusRec(filho, v, profundidade); +// TODO: repensar calculo do bônus +void calculaBonus(Lista grupo, int profundidade) { + for(No n = primeiroNoLista(grupo); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { + Vertice filho = (Vertice) getConteudo(m); + // Se o filho não está na lista irmaos e não está no grupo de vértices já consumidos + if(!filho->grupo && !pertenceLista(filho, grupo) && (filho->altura > v->altura)) { + v->bonus += filho->peso + calculaBonusRec(filho, v, profundidade); + } } } - return v->bonus = bonus; + return; } int calculaBonusRec(Vertice v, Vertice pai, int profundidade) { diff --git a/libs/jogador.h b/libs/jogador.h index e3c83184d12dfb12bdad3bb45e6accc196016fa9..d5698a34d0e87a5a715c3dfc913b0b88c7748f16 100644 --- a/libs/jogador.h +++ b/libs/jogador.h @@ -13,7 +13,7 @@ Lista Joga(Grafo g, Lista grupo); Lista filhosGrupo(Lista grupoPai); // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l -Lista agrupaCores(Lista vertices, Grafo g, int profundidade); +Lista agrupaCores(Lista vertices); -int calculaBonus(Vertice v, Lista irmaos, int profundidade); +void calculaBonus(Lista grupo, int profundidade); #endif