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

Add função que agrupa as cores dos filhos

parent ec136e6c
No related branches found
No related tags found
No related merge requests found
Pipeline #
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "grafo.h" #include "grafo.h"
Lista Joga(Grafo g, Lista grupo){ Lista Joga(Grafo g, Lista grupo){
Lista jogadas = constroiLista();
//TODO: A Logica toda do jogo vai ficar aqui //TODO: A Logica toda do jogo vai ficar aqui
// Pega os filhos do grupo // Pega os filhos do grupo
...@@ -14,8 +15,10 @@ Lista Joga(Grafo g, Lista grupo){ ...@@ -14,8 +15,10 @@ Lista Joga(Grafo g, Lista grupo){
// - RAIZ: grupo // - RAIZ: grupo
// - FILHOS: Cores alcancáveis a partir da raiz // - FILHOS: Cores alcancáveis a partir da raiz
// - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz // - 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
Lista coresFilhos = agrupaCores(filhos);
// Seleciona o melhor filho baseado em peso(filho) + bônus(filho) // (filho com a maior soma de filho e peso) // Seleciona o melhor filho baseado em peso(filho) + bônus(filho) // (filho com a maior soma de filho e peso)
// O bônus e calculado da seguinte forma: // O bônus é calculado da seguinte forma:
// - Soma o valor de cada neto (que não é alcançável pela raiz) // - Soma o valor de cada neto (que não é alcançável pela raiz)
// - Em caso de empate da soma peso + bônus: // - Em caso de empate da soma peso + bônus:
// - Escolher o filho que tem mais netos da mesma cor de um filho // - Escolher o filho que tem mais netos da mesma cor de um filho
...@@ -23,7 +26,8 @@ Lista Joga(Grafo g, Lista grupo){ ...@@ -23,7 +26,8 @@ Lista Joga(Grafo g, Lista grupo){
// Limpa as coisas // Limpa as coisas
destroiLista(filhos, NULL); destroiLista(filhos, NULL);
return constroiLista(); destroiLista(coresFilhos, destroiVertice);
return jogadas;
} }
Lista filhosGrupo(Lista l) { Lista filhosGrupo(Lista l) {
...@@ -37,3 +41,29 @@ Lista filhosGrupo(Lista l) { ...@@ -37,3 +41,29 @@ Lista filhosGrupo(Lista l) {
} }
return filhos; return filhos;
} }
Lista agrupaCores(Lista l) {
Lista agrupa = constroiLista();
for(No n = primeiroNoLista(l); n; n = getSucessorNo(n)) {
Vertice v = (Vertice) getConteudo(n);
// Verifica se a cor já está na lista
bool estaNaLista = false;
for(No m = primeiroNoLista(agrupa); m; m = getSucessorNo(m)) {
Vertice w = (Vertice) getConteudo(m);
// Se está, soma o peso do vértice
if(w->cor == v->cor) {
w->peso += v->peso;
estaNaLista = true;
}
}
// Se não está, cria um vértice para a cor
if(!estaNaLista) {
Vertice w = criaVertice();
w->cor = v->cor;
w->peso = v->peso;
insereLista(w, agrupa);
}
}
return agrupa;
}
...@@ -11,4 +11,7 @@ Lista Joga(Grafo g, Lista grupo); ...@@ -11,4 +11,7 @@ Lista Joga(Grafo g, Lista grupo);
// Retorna todos os filhos de uma lista de vértices // Retorna todos os filhos de uma lista de vértices
Lista filhosGrupo(Lista l); Lista filhosGrupo(Lista l);
// Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l
Lista agrupaCores(Lista l);
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment