diff --git a/README.md b/README.md index 0b7027fbdd2b52458f8ea24a9d77adaeedbbda64..fea996874f488d1882361516b53b4adc4936fbe8 100644 --- a/README.md +++ b/README.md @@ -81,14 +81,14 @@ Proposed solution: give a **HUGE** bonus to a group that is the last group of th Our code gave the sequence: ``` -93 -2 1 3 6 2 4 1 2 4 5 4 6 4 3 1 4 5 3 6 2 3 4 1 6 3 2 5 4 6 2 1 6 3 4 2 1 5 6 3 4 2 5 6 4 1 2 4 6 3 5 1 3 2 6 1 4 5 3 2 6 4 5 1 3 6 4 2 5 1 3 2 6 4 5 1 2 4 1 5 3 6 1 2 4 5 2 3 6 5 1 4 3 6 +86 +2 1 3 6 2 4 1 2 4 5 4 6 1 4 3 2 1 4 5 3 6 2 5 4 6 2 5 3 1 4 6 3 2 4 5 1 3 6 4 2 5 1 6 4 2 1 3 6 4 2 5 1 3 2 6 4 1 3 5 4 2 6 3 5 1 4 6 2 5 3 1 4 5 6 2 1 4 3 2 1 4 3 5 6 2 1 ``` **Test 6- 100 100 6 2** Our code gave the sequence: ``` -191 -5 2 1 5 3 2 4 1 4 2 3 1 4 5 6 4 2 1 6 3 2 5 4 1 6 2 3 1 5 4 6 2 3 4 6 5 1 2 6 4 3 5 1 3 4 6 1 2 5 3 4 1 2 6 5 4 1 2 3 5 6 1 4 2 3 5 6 2 4 1 5 3 2 4 6 5 1 2 3 4 5 2 6 1 3 4 5 2 6 1 3 4 5 2 1 3 6 4 1 5 2 6 3 1 4 2 5 6 1 4 2 3 5 6 4 1 2 3 6 5 4 1 3 6 2 4 5 3 1 6 5 4 2 3 1 6 5 4 3 2 1 6 4 5 3 1 6 2 4 5 1 3 4 2 6 3 4 6 1 5 2 3 1 6 4 5 2 6 3 4 1 2 5 4 6 3 1 2 5 1 3 4 6 2 5 3 4 1 6 2 3 +186 +5 2 1 5 3 2 4 1 4 2 3 1 4 5 6 4 1 2 3 6 4 2 5 1 3 6 2 4 5 1 3 4 6 5 2 4 1 3 6 2 5 1 3 4 2 6 1 5 4 3 2 5 6 1 4 3 2 5 6 1 4 3 2 5 4 1 6 2 5 3 1 4 2 6 5 3 1 2 4 6 3 5 4 1 2 6 5 3 2 4 1 5 6 3 2 4 5 1 3 6 2 4 1 5 6 2 3 1 4 2 5 6 1 3 4 5 6 2 1 4 5 3 6 1 4 2 3 5 6 1 2 4 3 1 6 5 2 4 1 3 2 5 6 4 1 3 6 5 2 4 1 3 6 5 4 2 6 1 5 4 3 6 2 1 3 5 1 4 2 3 1 5 3 4 6 2 5 3 5 1 6 4 2 1 3 6 ``` diff --git a/libs/jogador.c b/libs/jogador.c index ba91ac2f0d0075d2bf57a643893860bf4f0398c0..a89b831a73f97adc646df149dc5b46893167f23e 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -17,7 +17,7 @@ Lista Joga(Grafo g, Lista grupo){ // - 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 // Só é necessário para calcular o bônus de cada filho - Lista coresFilhos = agrupaCores(filhos); + Lista coresFilhos = agrupaCores(filhos, g); // Seleciona o melhor filho baseado em peso(filho) + bônus(filho) // (filho com a maior soma de filho e peso) // O bônus é calculado da seguinte forma: // - Soma o valor de cada neto (que não é alcançável pela raiz) @@ -75,7 +75,7 @@ Lista filhosGrupo(Lista grupoPai) { return filhos; } -Lista agrupaCores(Lista filhos) { +Lista agrupaCores(Lista filhos, Grafo g) { Lista agrupa = constroiLista(); for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); @@ -100,6 +100,23 @@ Lista agrupaCores(Lista filhos) { } } + // Depois de agrupar, verifica se algum grupo vai chegar ao fim nesta jogada + for(No n = primeiroNoLista(agrupa); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + int somaCor = 0; + for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + if(!w->grupo && w->cor == v->cor) { + somaCor += w->peso; + } + } + // Se a soma de todos os vértices que não pertencem ao grupo for igual + // ao peso do vértice agrupado, esta é a última jogada com aquela cor + if(v->peso == somaCor) { + v->bonus += 100; // Mais bonus para que essa cor seja a escolhida + } + } + return agrupa; } diff --git a/libs/jogador.h b/libs/jogador.h index aba24f9d772994cd3c93ee51efde2dbfa1750d30..8ec4d2d2f643e1344123525df22ce4289b9627f7 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 filhos); +Lista agrupaCores(Lista filhos, Grafo g); int calculaBonus(Vertice v, Lista filhos); #endif