From f0a4beae8badcf08de30ff67a68fd18accd4057f Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sun, 4 Jun 2017 13:46:33 -0300
Subject: [PATCH 01/20] =?UTF-8?q?Add=20fun=C3=A7=C3=A3o=20para=20calcular?=
 =?UTF-8?q?=20altura=20do=20grafo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/filha.c   |  9 +++++++++
 libs/grafo.c   | 34 ++++++++++++++++++++++++++++++++--
 libs/grafo.h   |  2 ++
 libs/jogador.c | 27 ++++++++++++++++-----------
 libs/no.c      |  4 ++++
 libs/vertice.c |  1 +
 libs/vertice.h |  1 +
 main.c         |  2 +-
 8 files changed, 66 insertions(+), 14 deletions(-)

diff --git a/libs/filha.c b/libs/filha.c
index 841081d..29a6673 100644
--- a/libs/filha.c
+++ b/libs/filha.c
@@ -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;
 }
diff --git a/libs/grafo.c b/libs/grafo.c
index 160a15e..79bbc3a 100644
--- a/libs/grafo.c
+++ b/libs/grafo.c
@@ -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);
         }
     }
diff --git a/libs/grafo.h b/libs/grafo.h
index ad9a4a2..847f6f7 100644
--- a/libs/grafo.h
+++ b/libs/grafo.h
@@ -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);
diff --git a/libs/jogador.c b/libs/jogador.c
index ba91ac2..310b94e 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -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);
@@ -46,16 +50,17 @@ Lista Joga(Grafo g, Lista grupo){
         // Limpa as coisas
         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;
diff --git a/libs/no.c b/libs/no.c
index b88cfce..7627f4e 100644
--- a/libs/no.c
+++ b/libs/no.c
@@ -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;
 }
 
diff --git a/libs/vertice.c b/libs/vertice.c
index 35fb0e5..2dd4590 100644
--- a/libs/vertice.c
+++ b/libs/vertice.c
@@ -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();
diff --git a/libs/vertice.h b/libs/vertice.h
index 9ee344e..c740ffc 100644
--- a/libs/vertice.h
+++ b/libs/vertice.h
@@ -7,6 +7,7 @@ struct Vertice {
     int cor;
     int peso;
     int bonus;
+    int altura;
     bool grupo;
     Lista pais;
     Lista filhos;
diff --git a/main.c b/main.c
index 8d59c2b..64059a9 100644
--- a/main.c
+++ b/main.c
@@ -17,7 +17,7 @@ int main(int argc, char *argv[]) {
         puts("Erro na leitura do tabuleiro");
         return -1;
     }
-    
+
     // Se colocar UMA e APENAS UMA coisa depois do main
     if(argc == 2) {
         // Calcula e imprime o número mínimo e máximo de jogadas
-- 
GitLab


From 1929bf379934a90fbefb224f0f3cf485fea7d9fd Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sun, 4 Jun 2017 22:30:12 -0300
Subject: [PATCH 02/20] =?UTF-8?q?Add=20coisas=20para=20definir=20altura=20?=
 =?UTF-8?q?da=20=C3=A1rvore=20de=20busca?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore              |   1 +
 Makefile                |   2 +-
 customTests/14x14-1.txt |  28 ++--
 libs/grafo.c            |  18 ++-
 libs/grafo.h            |   3 +-
 libs/jogador.c          |  77 ++++++++--
 libs/jogador.h          |   4 +-
 tests/floodit_h1        | Bin 0 -> 22888 bytes
 tests/floodit_h2        | Bin 0 -> 22888 bytes
 tests/runTests.sh       |  53 ++++---
 tests/tabuleiros.out    | 322 ++++++++++++++++++++++++++++++++++++++++
 11 files changed, 455 insertions(+), 53 deletions(-)
 create mode 100755 tests/floodit_h1
 create mode 100755 tests/floodit_h2
 create mode 100644 tests/tabuleiros.out

diff --git a/.gitignore b/.gitignore
index 0b30b8a..ce9f7b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@ tests/*.txt
 tests/*.png
 massif.out*
 *.out
+!tests/tabuleiros.out
diff --git a/Makefile b/Makefile
index 7c05fe5..1f81904 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-CFLAGS = -std=c99 -O2 -W -Wall -g 
+CFLAGS = -std=c99 -O2 -W -Wall -g
 
 .PHONY: all clean
 
diff --git a/customTests/14x14-1.txt b/customTests/14x14-1.txt
index 0aac78f..cfc40f2 100644
--- a/customTests/14x14-1.txt
+++ b/customTests/14x14-1.txt
@@ -1,15 +1,15 @@
 14 14 9
-    0     0     1     2     2     3     4     4     1     1     5     3     5     3 
-    3     4     0     0     1     2     2     4     1     1     5     4     2     1 
-    0     0     0     2     4     0     2     3     5     0     1     5     1     5 
-    1     3     3     3     4     4     0     0     4     0     0     0     5     2 
-    3     0     4     0     2     4     2     4     3     3     4     4     2     2 
-    3     5     2     2     5     1     5     2     5     3     0     1     2     0 
-    1     4     3     3     5     1     4     1     2     2     0     2     5     1 
-    5     2     1     0     4     0     2     5     1     2     2     5     3     4 
-    1     3     2     1     3     0     5     0     0     2     3     4     5     0 
-    0     4     2     0     1     4     4     4     0     1     3     1     1     2 
-    0     0     3     2     5     5     4     3     3     5     3     4     5     0 
-    0     1     1     5     4     0     1     5     4     4     3     0     1     3 
-    4     3     5     5     4     2     2     5     2     1     5     1     5     5 
-    3     1     2     2     2     1     1     1     5     1     1     3     2     1 
+1 1 2 3 3 4 5 5 2 2 6 4 6 4
+4 5 1 1 2 3 3 5 2 2 6 5 3 2
+1 1 1 3 5 1 3 4 6 1 2 6 2 6
+2 4 4 4 5 5 1 1 5 1 1 1 6 3
+4 1 5 1 3 5 3 5 4 4 5 5 3 3
+4 6 3 3 6 2 6 3 6 4 1 2 3 1
+2 5 4 4 6 2 5 2 3 3 1 3 6 2
+6 3 2 1 5 1 3 6 2 3 3 6 4 5
+2 4 3 2 4 1 6 1 1 3 4 5 6 1
+1 5 3 1 2 5 5 5 1 2 4 2 2 3
+1 1 4 3 6 6 5 4 4 6 4 5 6 1
+1 2 2 6 5 1 2 6 5 5 4 1 2 4
+5 4 6 6 5 3 3 6 3 2 6 2 6 6
+4 2 3 3 3 2 2 2 6 2 2 4 3 2
diff --git a/libs/grafo.c b/libs/grafo.c
index 79bbc3a..dd81194 100644
--- a/libs/grafo.c
+++ b/libs/grafo.c
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include "grafo.h"
 #include "lista.h"
+#include "filha.h"
 #include "vertice.h"
 #include "tabuleiro.h"
 #include <stdio.h>
@@ -42,6 +43,9 @@ Floodfill(celula, vertice)
 */
 
 void tabuleiroParaGrafo(Tblr t, Grafo g) {
+    g->x = t->x;
+    g->y = t->y;
+    g->cores = t->cores;
     //Para cada celula do tabuleiro
     for(int i=0; i < t->x; ++i) {
         for(int j=0; j < t->y; ++j) {
@@ -127,8 +131,8 @@ void floodFill(Tblr t, Vertice v, int i, int j){
     return;
 }
 
-#include "filha.h"
-void calculaAltura(Grafo g, Lista raiz) {
+int calculaAltura(Grafo g, Lista raiz) {
+    int alturaMax = 0;
     for(No n = primeiroNoLista(g->vertices); n; n = getSucessorNo(n)) {
         Vertice v = (Vertice) getConteudo(n);
         v->altura = -1;
@@ -151,10 +155,16 @@ void calculaAltura(Grafo g, Lista raiz) {
             Vertice filho = (Vertice) getConteudo(m);
             if(filho->altura == -1) {
                 filho->altura = v->altura+1;
+                if(filho->altura > alturaMax) {
+                    alturaMax = filho->altura;
+                }
                 insereFilha(filho, fila);
             }
         }
+        free(n);
     }
+    destroiFilha(fila, NULL);
+    return alturaMax;
 }
 
 void destroiGrafo(Grafo g) {
@@ -174,10 +184,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\npeso=%d\naltura=%d\"];\n", pai, pai->cor, pai->peso, pai->altura);
+        fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\nbonus=%d\naltura=%d\"];\n", pai, pai->cor, pai->peso, pai->bonus, pai->altura);
         for(No m = primeiroNoLista(pai->filhos); m; m = getSucessorNo(m)) {
             Vertice filho = (Vertice) getConteudo(m);
-            fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\naltura=%d\"];\n", filho, filho->cor, filho->peso, filho->altura);
+            fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\nbonus=%d\naltura=%d\"];\n", filho, filho->cor, filho->peso, filho->bonus, filho->altura);
             fprintf(fp, "\t\"%p\" -- \"%p\";\n", pai, filho);
         }
     }
diff --git a/libs/grafo.h b/libs/grafo.h
index 847f6f7..189edbf 100644
--- a/libs/grafo.h
+++ b/libs/grafo.h
@@ -4,6 +4,7 @@
 #include <stdio.h>
 
 struct Grafo {
+    int x, y, cores;
     Lista vertices;
 };
 
@@ -19,7 +20,7 @@ void tabuleiroParaGrafo(Tblr t, Grafo g);
 
 void floodFill(Tblr t, Vertice v, int i, int j);
 
-void calculaAltura(Grafo g, Lista raiz);
+int calculaAltura(Grafo g, Lista raiz);
 
 void destroiGrafo(Grafo g);
 
diff --git a/libs/jogador.c b/libs/jogador.c
index 310b94e..eb15333 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -4,12 +4,13 @@
 #include "jogador.h"
 #include "lista.h"
 #include "grafo.h"
+#include <math.h>
 
 Lista Joga(Grafo g, Lista grupo){
     Lista jogadas = constroiLista();
     //TODO: A Logica toda do jogo vai ficar aqui
     int counter = 1;
-    do {
+    while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) {
         // Pega os filhos do grupo
         Lista filhos = filhosGrupo(grupo);
         // Monta a árvore de busca:
@@ -17,7 +18,17 @@ 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);
+        int altura = calculaAltura(g, grupo);
+        // printf("\tJOGADA %d\n", counter);
+        Lista coresFilhos = agrupaCores(filhos, g, altura, tamanhoLista(g->vertices) - tamanhoLista(grupo));
+        // 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));
+        // printf("\tTamanho coresFilhos %d\n", tamanhoLista(coresFilhos));
+        // for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) {
+        //     Vertice v = (Vertice) getConteudo(n);
+        //     printf("\t\tVértice - cor: %d, peso: %d, bonus: %d\n", v->cor, v->peso, v->bonus);
+        // }
         // 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)
@@ -31,12 +42,13 @@ Lista Joga(Grafo g, Lista grupo){
             // TODO: tratar empates!
             if((v->bonus) > (maior->bonus)) {
                 maior = v;
-            } else if(v->bonus == maior->bonus) {
+            } else if((v->bonus) == (maior->bonus)) {
                 if(v->peso > maior->peso) {
                     maior = v;
                 }
             }
         }
+        // printf("\t\tCOR ESCOLHIDA: %d\n", maior->cor);
         insereLista(maior->cor, jogadas);
         // "Pinta o tablueiro"
         for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) {
@@ -50,7 +62,7 @@ Lista Joga(Grafo g, Lista grupo){
         // Limpa as coisas
         destroiLista(filhos, NULL);
         destroiLista(coresFilhos, destroiVertice);
-        
+
         calculaAltura(g, grupo);
         // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo
          char str[32];
@@ -61,7 +73,7 @@ Lista Joga(Grafo g, Lista grupo){
          }
          fclose(debug);
          ++counter;
-    } while(tamanhoLista(grupo) < tamanhoLista(g->vertices));
+    }
 
     return jogadas;
 }
@@ -80,8 +92,17 @@ Lista filhosGrupo(Lista grupoPai) {
     return filhos;
 }
 
-Lista agrupaCores(Lista filhos) {
+// TODO: primeiro agrupa, DEPOIS calcula os bônus!!!
+// Para calcular o bônus, agrupa os filhos de um grupo e aí calcula o bônus
+// Ou seja, 2 ou mais vértices da MESMA COR que tenham o mesmo filho (repetição)
+//      só contarão UMA VEZ o bônus+peso daquele filho
+Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos) {
     Lista agrupa = constroiLista();
+    double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores;
+    double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2);
+    int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos));
+    // printf("\t\tProfundidade: %d\n", profundidade);
+    // printf("\t\tRazão: %f\n", (altura/sqrt(naoConsumidos)));
     for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) {
         Vertice v = (Vertice) getConteudo(n);
         // Verifica se a cor já está na lista
@@ -91,7 +112,7 @@ Lista agrupaCores(Lista filhos) {
             // Se está, soma o peso do vértice
             if(w->cor == v->cor) {
                 w->peso += v->peso;
-                w->bonus += calculaBonus(v, filhos);
+                w->bonus += calculaBonus(v, filhos, profundidade);
                 estaNaLista = true;
             }
         }
@@ -100,22 +121,52 @@ Lista agrupaCores(Lista filhos) {
             Vertice w = criaVertice();
             w->cor = v->cor;
             w->peso = v->peso;
-            w->bonus = calculaBonus(v, filhos);
+            w->bonus = calculaBonus(v, filhos, profundidade);
             insereLista(w, agrupa);
         }
     }
 
+    // Depois de agrupar, verifica se alguma cor 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;
 }
 
-int calculaBonus(Vertice v, Lista filhos) {
+int calculaBonus(Vertice v, Lista filhos, int profundidade) {
     int bonus = 0;
     for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) {
-        Vertice filho = getConteudo(n);
-        // Se o filho não está na lsita filhos e não está no grupo de vértices já consumidos
+        Vertice filho = (Vertice) getConteudo(n);
+        // Se o filho não está na lista filhos e não está no grupo de vértices já consumidos
         if(!filho->grupo && !pertenceLista(filho, filhos)) {
-            bonus += filho->peso;
+            bonus += filho->peso + calculaBonusRec(filho, v, profundidade);
+        }
+    }
+    return v->bonus = bonus;
+}
+
+int calculaBonusRec(Vertice v, Vertice pai, int profundidade) {
+    if(profundidade <= 0) return 0;
+    int bonus = 0;
+    for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) {
+        Vertice filho = (Vertice) getConteudo(n);
+
+        if(!filho->grupo && !pertenceLista(filho, pai->filhos) && (filho->altura > v->altura)) {
+            bonus += filho->peso + calculaBonusRec(filho, v, profundidade-1);
         }
     }
-    return bonus;
+    return v->bonus = bonus;
 }
diff --git a/libs/jogador.h b/libs/jogador.h
index aba24f9..b3d0b39 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 altura, int naoConsumidos);
 
-int calculaBonus(Vertice v, Lista filhos);
+int calculaBonus(Vertice v, Lista filhos, int profundidade);
 #endif
diff --git a/tests/floodit_h1 b/tests/floodit_h1
new file mode 100755
index 0000000000000000000000000000000000000000..1bf1bb07d92475f1b8cdb825d5eca2382ee1a529
GIT binary patch
literal 22888
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

literal 0
HcmV?d00001

diff --git a/tests/floodit_h2 b/tests/floodit_h2
new file mode 100755
index 0000000000000000000000000000000000000000..8b18fcdbf8d7c9d330d4a627f4f2558d52eca984
GIT binary patch
literal 22888
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

literal 0
HcmV?d00001

diff --git a/tests/runTests.sh b/tests/runTests.sh
index 46c5f05..5dbf175 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -1,13 +1,13 @@
 #!/bin/bash
 
 # tempo máximo para executar, em milisegundos
-tempo_max=10000 #10s
+tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(4 8 16 32 64 128)
+tams=(2 3 4 8 16 32)
 
 # lista de cores
-cores=(2 4 8 16)
+cores=(4 8 10 16)
 
 #-- Cores do terminal
 RED='\033[0;31m'
@@ -31,19 +31,33 @@ do
         echo "Número de cores: ${cor}"
         T_soma_cor=0
         T_max_cor=0
-        for j in $(seq 1 $i)
+        N_TESTES=500
+        for j in $(seq 1 ${N_TESTES})
         do
-            echo -ne "Tabuleiro com ${i} linhas e ${cor} cores: ${i}x${j} (T max: $(($T_max_cor/1000000000))."
-            printf "%03d" $(($T_max_cor/1000000))
+            echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))."
+            printf "%03d" $(($T_max_cor/1000000%1000))
             echo -ne ")"\\r
             semente=$RANDOM
             # echo "Usando semente: ${semente}"
-            ./test $i $j $cor $semente
+            ./test $i $i $cor $semente
             T_inicial=$(date +%s%N)
-            ../main < "/tmp/${semente}.in" > /dev/null
+            ../main < "/tmp/${semente}.in" > /tmp/resp.out
             T_gasto=$(($(date +%s%N) - $T_inicial))
             T_soma_cor=$(($T_gasto + $T_soma_cor))
             T_soma_total=$(($T_gasto + $T_soma_total))
+            ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out
+            ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out
+            RESP=$(cat /tmp/resp.out | head -n1)
+            H1=$(cat /tmp/h1.out | head -n1)
+            H2=$(cat /tmp/h2.out | head -n1)
+            if [ $RESP -gt $H1 ]; then
+                echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n"
+                echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt
+            fi
+            if [ $RESP -gt $H2 ]; then
+                echo -ne "${RED}Heurística h2 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H2} e nós em ${RESP}${NC}\n"
+                echo "${i} ${i} ${cor} ${semente} (h2: ${H2})" >> tabuleiros.txt
+            fi
             # tempo em segundos
             S=$(($T_gasto/1000000000))
             # tempo em milisegundos
@@ -52,36 +66,39 @@ do
             if [ $T_max_cor -lt $T_gasto ]; then
                 T_max_cor=$T_gasto
             fi
-            if (($M>$tempo_max)); then
-                echo -e "\n${RED}Tabuleiro ${i} ${j} ${cor} ${semente} levou mais de ${tempo_max} milisegundos: ${S}.${M}s${NC}"
-                echo "${i} ${j} ${cor} ${semente}" >> tabuleiros.txt
-            fi
+            # if (($M>$tempo_max)); then
+            #     echo -e "\n${RED}Tabuleiro ${i} ${i} ${cor} ${semente} levou mais de ${tempo_max} milisegundos: ${S}.${M}s${NC}"
+            #     echo "${i} ${i} ${cor} ${semente}" >> tabuleiros.txt
+            # fi
             rm "/tmp/${semente}.in"
+            rm "/tmp/resp.out"
+            rm "/tmp/h1.out"
+            rm "/tmp/h2.out"
         done
-        T_medio_cor=$(($T_soma_cor/$i))
+        T_medio_cor=$(($T_soma_cor/${N_TESTES}))
         S_medio_cor=$(($T_medio_cor/1000000000))
         M_medio_cor=$(($T_medio_cor/1000000))
         echo -ne "\n${CYAN}Tempo médio com ${cor} cores: ${S_medio_cor}."
-        printf "%03d" ${M_medio_cor}
+        printf "%03d" $((${M_medio_cor}%1000))
         echo -e "s (${T_medio_cor})${NC}\n"
         echo -e "${i}\t${cor}\t${M_medio_cor}" >> tempos.txt
         echo -e "${i}\t${cor}\t$(($T_max_cor/1000000))" >> piores.txt
     done
-    T_medio_total=$(( $T_soma_total/($i * ${#cores[*]}) ))
+    T_medio_total=$(( $T_soma_total/(${N_TESTES} * ${#cores[*]}) ))
     S_medio_total=$(($T_medio_total/1000000000))
     M_medio_total=$(($T_medio_total/1000000))
     echo -ne "${BLUE}Tempo médio com tamanho ${i}: ${S_medio_total}."
-    printf "%03d" ${M_medio_total}
+    printf "%03d" $((${M_medio_total}%1000))
     echo -e "s (${T_medio_total})${NC}\n"
     echo -e "${i}\t${M_medio_total}" >> medias.txt
 done
 
 fs=$(cat tabuleiros.txt | wc -l)
 if [ ${fs} -gt "1" ]; then
-    echo -e "${RED}${fs} tabuleiro(s) passou(passaram) do tempo limite de ${tempo_max} milisegundos:${NC}"
+    echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}"
     cat tabuleiros.txt
     exit 1
 else
-    echo -e "${GREEN}Nenhum tabuleiro passou do tempo limite de ${tempo_max} milisegundos${NC}"
+    echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}"
     exit 0
 fi
diff --git a/tests/tabuleiros.out b/tests/tabuleiros.out
new file mode 100644
index 0000000..8bc4f33
--- /dev/null
+++ b/tests/tabuleiros.out
@@ -0,0 +1,322 @@
+3 3 8 26909 (h1: 5)
+3 3 8 26909 (h2: 5)
+4 4 10 14295 (h2: 8)
+4 4 10 15795 (h1: 10)
+4 4 10 15795 (h2: 10)
+4 4 10 20490 (h1: 10)
+4 4 10 20490 (h2: 10)
+4 4 10 29581 (h1: 9)
+4 4 10 4049 (h1: 8)
+4 4 10 4049 (h2: 8)
+4 4 16 1235 (h1: 10)
+4 4 4 13848 (h2: 6)
+4 4 4 17004 (h1: 6)
+4 4 4 23024 (h1: 6)
+4 4 4 25453 (h2: 5)
+4 4 4 2597 (h1: 6)
+4 4 4 27649 (h1: 7)
+4 4 4 27649 (h2: 7)
+4 4 4 6629 (h1: 6)
+4 4 4 6629 (h1: 6)
+4 4 8 20898 (h1: 8)
+4 4 8 22414 (h2: 8)
+4 4 8 27865 (h1: 8)
+4 4 8 6846 (h1: 8)
+4 4 8 6846 (h2: 8)
+4 4 8 934 (h1: 8)
+4 4 8 934 (h2: 8)
+4 4 8 9699 (h1: 9)
+4 4 8 9699 (h2: 9)
+8 8 10 19467 (h1: 21)
+8 8 10 28993 (h2: 19)
+8 8 10 7105 (h2: 20)
+8 8 4 11513 (h2: 7)
+8 8 4 12332 (h2: 9)
+8 8 4 12593 (h2: 9)
+8 8 4 13507 (h1: 9)
+8 8 4 13507 (h2: 9)
+8 8 4 15307 (h2: 8)
+8 8 4 15554 (h2: 11)
+8 8 4 15903 (h2: 8)
+8 8 4 17156 (h1: 9)
+8 8 4 17203 (h2: 8)
+8 8 4 17614 (h1: 10)
+8 8 4 17614 (h2: 10)
+8 8 4 19677 (h1: 7)
+8 8 4 20183 (h2: 10)
+8 8 4 21208 (h2: 8)
+8 8 4 21352 (h1: 10)
+8 8 4 21352 (h2: 10)
+8 8 4 21946 (h1: 11)
+8 8 4 21946 (h2: 11)
+8 8 4 22652 (h1: 10)
+8 8 4 22791 (h2: 9)
+8 8 4 22893 (h2: 9)
+8 8 4 25309 (h2: 7)
+8 8 4 26112 (h2: 10)
+8 8 4 30518 (h2: 8)
+8 8 4 3970 (h1: 12)
+8 8 4 496 (h2: 9)
+8 8 4 5020 (h1: 8)
+8 8 4 5427 (h1: 9)
+8 8 4 5427 (h2: 9)
+8 8 4 74 (h2: 9)
+8 8 4 8073 (h1: 10)
+8 8 4 853 (h1: 8)
+8 8 4 9982 (h2: 9)
+8 8 8 1111 (h2: 19)
+8 8 8 11191 (h2: 17)
+8 8 8 15190 (h1: 15)
+8 8 8 15820 (h2: 17)
+8 8 8 20926 (h2: 13)
+8 8 8 5956 (h2: 15)
+8 8 8 8458 (h2: 17)
+16 16 4 12080 (h2: 15)
+16 16 4 17382 (h2: 18)
+16 16 4 19519 (h2: 18)
+16 16 4 20629 (h2: 14)
+16 16 4 22277 (h2: 17)
+16 16 4 23645 (h2: 16)
+16 16 4 24852 (h2: 16)
+16 16 4 28245 (h2: 17)
+16 16 4 3916 (h2: 18)
+16 16 4 5514 (h2: 16)
+16 16 8 1142 (h2: 29)
+16 16 8 18339 (h2: 34)
+16 16 8 7218 (h2: 35)
+32 32 4 6052 (h2: 30)
+3 3 4 20010 (h1: 4)
+3 3 4 20010 (h2: 4)
+3 3 4 5987 (h1: 5)
+3 3 4 5987 (h2: 5)
+3 3 8 20411 (h1: 4)
+4 4 10 13182 (h1: 8)
+4 4 10 15113 (h1: 8)
+4 4 10 15113 (h2: 8)
+4 4 10 17622 (h1: 9)
+4 4 10 17622 (h2: 9)
+4 4 10 26074 (h1: 9)
+4 4 10 26074 (h2: 9)
+4 4 10 29580 (h1: 10)
+4 4 10 29580 (h2: 10)
+4 4 10 30396 (h1: 9)
+4 4 10 30396 (h2: 9)
+4 4 10 4203 (h1: 10)
+4 4 10 4203 (h2: 10)
+4 4 16 4021 (h1: 10)
+4 4 16 4021 (h2: 10)
+4 4 4 12924 (h1: 5)
+4 4 4 19886 (h2: 5)
+4 4 4 25409 (h1: 5)
+4 4 4 25409 (h2: 5)
+4 4 4 25453 (h2: 5)
+4 4 4 27649 (h1: 7)
+4 4 4 27649 (h2: 7)
+4 4 4 4016 (h1: 6)
+4 4 4 4016 (h2: 6)
+4 4 4 8294 (h2: 5)
+4 4 4 8672 (h1: 5)
+4 4 4 8672 (h2: 5)
+4 4 8 22013 (h1: 9)
+4 4 8 7793 (h1: 8)
+4 4 8 7793 (h2: 8)
+8 8 10 15701 (h1: 20)
+8 8 10 19677 (h2: 18)
+8 8 10 21121 (h2: 20)
+8 8 10 25173 (h2: 18)
+8 8 10 25636 (h2: 19)
+8 8 10 28473 (h2: 20)
+8 8 10 31628 (h2: 18)
+8 8 10 5599 (h2: 17)
+8 8 16 14392 (h2: 24)
+8 8 16 25031 (h2: 24)
+8 8 16 2700 (h2: 23)
+8 8 16 27020 (h2: 23)
+8 8 4 10041 (h1: 10)
+8 8 4 1093 (h1: 9)
+8 8 4 11071 (h2: 10)
+8 8 4 11355 (h1: 10)
+8 8 4 11355 (h2: 10)
+8 8 4 12332 (h2: 9)
+8 8 4 12400 (h1: 10)
+8 8 4 13881 (h2: 9)
+8 8 4 13936 (h2: 8)
+8 8 4 15605 (h1: 9)
+8 8 4 15605 (h2: 9)
+8 8 4 16964 (h1: 9)
+8 8 4 20245 (h1: 7)
+8 8 4 20245 (h2: 7)
+8 8 4 2025 (h1: 9)
+8 8 4 2025 (h2: 9)
+8 8 4 21823 (h2: 10)
+8 8 4 21975 (h2: 7)
+8 8 4 22199 (h1: 8)
+8 8 4 22199 (h2: 8)
+8 8 4 22366 (h1: 9)
+8 8 4 23926 (h1: 7)
+8 8 4 24376 (h2: 8)
+8 8 4 26014 (h2: 8)
+8 8 4 2639 (h1: 10)
+8 8 4 26762 (h2: 8)
+8 8 4 28291 (h2: 9)
+8 8 4 30577 (h2: 11)
+8 8 4 30613 (h2: 9)
+8 8 4 30711 (h2: 10)
+8 8 4 3085 (h2: 10)
+8 8 4 31339 (h1: 8)
+8 8 4 31339 (h2: 8)
+8 8 4 3320 (h2: 10)
+8 8 4 3559 (h2: 10)
+8 8 4 4900 (h2: 8)
+8 8 4 4986 (h1: 8)
+8 8 4 4986 (h1: 8)
+8 8 4 5030 (h2: 8)
+8 8 4 5949 (h2: 8)
+8 8 4 5988 (h1: 10)
+8 8 4 6183 (h1: 10)
+8 8 4 829 (h2: 8)
+8 8 4 8665 (h1: 10)
+8 8 8 14824 (h2: 15)
+8 8 8 1489 (h2: 16)
+8 8 8 15610 (h2: 14)
+8 8 8 20262 (h2: 19)
+8 8 8 23461 (h1: 17)
+8 8 8 23461 (h2: 17)
+8 8 8 28248 (h1: 16)
+8 8 8 29853 (h1: 17)
+8 8 8 31307 (h2: 15)
+8 8 8 31586 (h2: 15)
+8 8 8 6033 (h2: 16)
+8 8 8 632 (h2: 17)
+16 16 4 1199 (h2: 17)
+16 16 4 12747 (h2: 19)
+16 16 4 16762 (h2: 16)
+16 16 4 17784 (h2: 18)
+16 16 4 20739 (h2: 16)
+16 16 4 25688 (h2: 18)
+16 16 4 29043 (h2: 17)
+16 16 4 3595 (h2: 19)
+16 16 4 4552 (h2: 20)
+16 16 4 8715 (h2: 17)
+16 16 8 2925 (h2: 29)
+3 3 4 30001 (h1: 4)
+3 3 4 30001 (h2: 4)
+3 3 8 12831 (h1: 5)
+3 3 8 12831 (h2: 5)
+3 3 8 12891 (h1: 4)
+3 3 8 7096 (h1: 5)
+3 3 8 7096 (h2: 5)
+4 4 10 11135 (h1: 7)
+4 4 10 11135 (h2: 7)
+4 4 10 11196 (h1: 9)
+4 4 10 11196 (h2: 9)
+4 4 10 18982 (h1: 10)
+4 4 10 18982 (h2: 10)
+4 4 10 21895 (h1: 8)
+4 4 10 26585 (h1: 10)
+4 4 10 26585 (h2: 10)
+4 4 10 27139 (h1: 8)
+4 4 10 27139 (h2: 8)
+4 4 10 27793 (h2: 9)
+4 4 16 15048 (h1: 10)
+4 4 16 15048 (h2: 10)
+4 4 16 21518 (h1: 10)
+4 4 16 21518 (h2: 10)
+4 4 16 27610 (h1: 10)
+4 4 16 27610 (h2: 10)
+4 4 4 1089 (h2: 6)
+4 4 4 1293 (h2: 5)
+4 4 4 19021 (h1: 6)
+4 4 4 22962 (h1: 5)
+4 4 4 27765 (h1: 5)
+4 4 4 2845 (h1: 6)
+4 4 4 2845 (h2: 6)
+4 4 4 5744 (h1: 5)
+4 4 4 5744 (h2: 5)
+4 4 4 7524 (h1: 5)
+4 4 8 1420 (h1: 9)
+4 4 8 1420 (h2: 9)
+4 4 8 16874 (h2: 7)
+4 4 8 25928 (h1: 7)
+4 4 8 25928 (h2: 7)
+4 4 8 3722 (h1: 9)
+4 4 8 3722 (h2: 9)
+4 4 8 8603 (h1: 9)
+4 4 8 8603 (h2: 9)
+8 8 10 10192 (h2: 18)
+8 8 10 17877 (h1: 20)
+8 8 10 23653 (h2: 20)
+8 8 10 23660 (h1: 19)
+8 8 10 23660 (h2: 19)
+8 8 10 27684 (h2: 22)
+8 8 10 5660 (h2: 18)
+8 8 16 15390 (h2: 22)
+8 8 16 18644 (h2: 24)
+8 8 4 1044 (h2: 9)
+8 8 4 11514 (h2: 10)
+8 8 4 1276 (h2: 10)
+8 8 4 12898 (h1: 10)
+8 8 4 12898 (h2: 10)
+8 8 4 1488 (h1: 9)
+8 8 4 15559 (h1: 10)
+8 8 4 15559 (h2: 10)
+8 8 4 16082 (h2: 10)
+8 8 4 17637 (h2: 9)
+8 8 4 20457 (h2: 8)
+8 8 4 21566 (h2: 11)
+8 8 4 22549 (h2: 10)
+8 8 4 25045 (h2: 9)
+8 8 4 27315 (h2: 10)
+8 8 4 27654 (h1: 10)
+8 8 4 27654 (h2: 10)
+8 8 4 27719 (h1: 8)
+8 8 4 27719 (h2: 8)
+8 8 4 27919 (h1: 11)
+8 8 4 27919 (h2: 11)
+8 8 4 28078 (h2: 10)
+8 8 4 28536 (h1: 7)
+8 8 4 28567 (h2: 8)
+8 8 4 29660 (h2: 8)
+8 8 4 30049 (h2: 8)
+8 8 4 30239 (h1: 9)
+8 8 4 31396 (h2: 10)
+8 8 4 3259 (h1: 11)
+8 8 4 3259 (h2: 10)
+8 8 4 3360 (h1: 10)
+8 8 4 3360 (h2: 10)
+8 8 4 3612 (h2: 10)
+8 8 4 7576 (h2: 11)
+8 8 4 914 (h2: 8)
+8 8 8 10087 (h1: 17)
+8 8 8 10087 (h2: 17)
+8 8 8 16149 (h2: 18)
+8 8 8 18904 (h2: 18)
+8 8 8 19447 (h2: 16)
+8 8 8 22319 (h2: 18)
+8 8 8 23399 (h2: 15)
+8 8 8 25477 (h2: 16)
+8 8 8 26199 (h2: 16)
+8 8 8 26728 (h2: 16)
+8 8 8 28639 (h2: 16)
+8 8 8 29967 (h2: 18)
+8 8 8 5152 (h2: 16)
+8 8 8 6808 (h2: 19)
+8 8 8 8012 (h1: 16)
+8 8 8 8375 (h2: 17)
+16 16 4 14252 (h2: 16)
+16 16 4 14293 (h2: 17)
+16 16 4 15621 (h1: 17)
+16 16 4 15621 (h2: 16)
+16 16 4 16716 (h2: 15)
+16 16 4 17018 (h2: 17)
+16 16 4 18172 (h2: 15)
+16 16 4 20105 (h2: 16)
+16 16 4 22607 (h2: 16)
+16 16 4 25922 (h2: 18)
+16 16 4 26202 (h2: 16)
+16 16 4 27227 (h2: 17)
+16 16 4 28222 (h2: 16)
+16 16 4 31677 (h2: 17)
+16 16 4 32428 (h2: 16)
+16 16 4 5418 (h2: 17)
+32 32 4 5482 (h2: 34)
-- 
GitLab


From b3c9f7851281efdd232f2f1a2b631e3813ab0248 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sun, 4 Jun 2017 23:27:34 -0300
Subject: [PATCH 03/20] =?UTF-8?q?Altera=20cabe=C3=A7alho=20da=20fun=C3=A7?=
 =?UTF-8?q?=C3=A3o=20calculaBonus?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/jogador.c    | 26 +++++++++++++-------------
 libs/jogador.h    |  2 +-
 tests/runTests.sh |  2 +-
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index eb15333..00d83b3 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -11,6 +11,7 @@ Lista Joga(Grafo g, Lista grupo){
     //TODO: A Logica toda do jogo vai ficar aqui
     int counter = 1;
     while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) {
+        int altura = calculaAltura(g, grupo);
         // Pega os filhos do grupo
         Lista filhos = filhosGrupo(grupo);
         // Monta a árvore de busca:
@@ -18,7 +19,6 @@ 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
-        int altura = calculaAltura(g, grupo);
         // printf("\tJOGADA %d\n", counter);
         Lista coresFilhos = agrupaCores(filhos, g, altura, tamanhoLista(g->vertices) - tamanhoLista(grupo));
         // printf("\tAltura da árvore: %d\n", altura);
@@ -65,14 +65,14 @@ Lista Joga(Grafo g, Lista grupo){
 
         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;
+        // char str[32];
+        // sprintf(str, "./jogada%d.out", counter );
+        // FILE* debug = fopen(str, "w+");
+        // if(debug) {
+        //     grafoParaDot(g, grupo, debug);
+        // }
+        // fclose(debug);
+        ++counter;
     }
 
     return jogadas;
@@ -84,7 +84,7 @@ Lista filhosGrupo(Lista grupoPai) {
         Vertice pai = (Vertice) getConteudo(n);
         for(No m = primeiroNoLista(pai->filhos); m; m = getSucessorNo(m)) {
             Vertice filho = (Vertice) getConteudo(m);
-            if(!filho->grupo) {
+            if(!filho->grupo && filho->altura > pai->altura) {
                 insereUnicoLista(filho, filhos);
             }
         }
@@ -146,12 +146,12 @@ Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos) {
     return agrupa;
 }
 
-int calculaBonus(Vertice v, Lista filhos, int profundidade) {
+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 filhos e não está no grupo de vértices já consumidos
-        if(!filho->grupo && !pertenceLista(filho, filhos)) {
+        // 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);
         }
     }
diff --git a/libs/jogador.h b/libs/jogador.h
index b3d0b39..5ec0b20 100644
--- a/libs/jogador.h
+++ b/libs/jogador.h
@@ -15,5 +15,5 @@ Lista filhosGrupo(Lista grupoPai);
 // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l
 Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos);
 
-int calculaBonus(Vertice v, Lista filhos, int profundidade);
+int calculaBonus(Vertice v, Lista irmaos, int profundidade);
 #endif
diff --git a/tests/runTests.sh b/tests/runTests.sh
index 5dbf175..ca61958 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -4,7 +4,7 @@
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(2 3 4 8 16 32)
+tams=(3 4 8 16 32)
 
 # lista de cores
 cores=(4 8 10 16)
-- 
GitLab


From 113c2d1ef1e186a2de857867fe2bac51ac04280c Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Mon, 5 Jun 2017 11:43:13 -0300
Subject: [PATCH 04/20] =?UTF-8?q?Tentando=20arrumar=20o=20b=C3=B4nus?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/jogador.c | 101 +++++++++++++++++++++++++++++++------------------
 libs/jogador.h |   2 +-
 libs/lista.c   |   8 +++-
 libs/vertice.c |   1 +
 libs/vertice.h |   1 +
 5 files changed, 75 insertions(+), 38 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index 00d83b3..33ab053 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -10,8 +10,19 @@ Lista Joga(Grafo g, Lista grupo){
     Lista jogadas = constroiLista();
     //TODO: A Logica toda do jogo vai ficar aqui
     int counter = 1;
+    double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores;
+    double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2);
     while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) {
+        // Calcula a altura
         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;
+        }
+
         // Pega os filhos do grupo
         Lista filhos = filhosGrupo(grupo);
         // Monta a árvore de busca:
@@ -20,7 +31,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, altura, tamanhoLista(g->vertices) - tamanhoLista(grupo));
+        Lista coresFilhos = agrupaCores(filhos, g, profundidade);
         // 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));
@@ -45,6 +56,18 @@ 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;
                 }
             }
         }
@@ -65,13 +88,13 @@ Lista Joga(Grafo g, Lista grupo){
 
         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);
+        char str[32];
+        sprintf(str, "./jogada%d.out", counter );
+        FILE* debug = fopen(str, "w+");
+        if(debug) {
+            grafoParaDot(g, grupo, debug);
+        }
+        fclose(debug);
         ++counter;
     }
 
@@ -92,55 +115,61 @@ Lista filhosGrupo(Lista grupoPai) {
     return filhos;
 }
 
-// TODO: primeiro agrupa, DEPOIS calcula os bônus!!!
-// Para calcular o bônus, agrupa os filhos de um grupo e aí calcula o bônus
-// Ou seja, 2 ou mais vértices da MESMA COR que tenham o mesmo filho (repetição)
-//      só contarão UMA VEZ o bônus+peso daquele filho
-Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos) {
+Lista agrupaCores(Lista vertices, Grafo g, int profundidade) {
+    if(profundidade < 0 ) return NULL;
     Lista agrupa = constroiLista();
-    double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores;
-    double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2);
-    int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos));
-    // printf("\t\tProfundidade: %d\n", profundidade);
-    // printf("\t\tRazão: %f\n", (altura/sqrt(naoConsumidos)));
-    for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) {
+    for(No n = primeiroNoLista(vertices); 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)) {
+        // Verifica se a cor já está agrupada
+        bool estaAgrupado = false;
+        for(No m = primeiroNoLista(agrupa); m && !estaAgrupado; 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;
-                w->bonus += calculaBonus(v, filhos, profundidade);
-                estaNaLista = true;
+                insereUnicoLista(v, w->pais);
+                for(No o = primeiroNoLista(v->filhos); o; o = getSucessorNo(o)) {
+                    Vertice x = (Vertice) getConteudo(o);
+                    if(x->altura > v->altura) insereUnicoLista(x, w->filhos);
+                }
+                estaAgrupado = true;
             }
         }
-        // Se não está, cria um vértice para a cor
-        if(!estaNaLista) {
+
+        // Se não está agrupado...
+        if(!estaAgrupado) {
             Vertice w = criaVertice();
             w->cor = v->cor;
             w->peso = v->peso;
-            w->bonus = calculaBonus(v, filhos, profundidade);
+            w->altura = v->altura;
+            insereUnicoLista(v, w->pais);
+            for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) {
+                Vertice x = (Vertice) getConteudo(m);
+                if(x->altura > v->altura) insereUnicoLista(x, w->filhos);
+            }
             insereLista(w, agrupa);
         }
     }
 
-    // Depois de agrupar, verifica se alguma cor vai chegar ao fim nesta jogada
+    // 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);
-        int somaCor = 0;
-        for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) {
+        Lista filhosAgrupa = agrupaCores(v->filhos, g, profundidade-1);
+        for(No m = primeiroNoLista(filhosAgrupa); m; m = getSucessorNo(m)) {
             Vertice w = (Vertice) getConteudo(m);
-            if(!w->grupo && w->cor == v->cor) {
-                somaCor += w->peso;
+            // 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;
             }
         }
-        // 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
+        for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) {
+            Vertice w = (Vertice) getConteudo(m);
+            w->bonus = v->bonus;
         }
+        destroiLista(filhosAgrupa, NULL);
     }
 
     return agrupa;
diff --git a/libs/jogador.h b/libs/jogador.h
index 5ec0b20..e3c8318 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, Grafo g, int altura, int naoConsumidos);
+Lista agrupaCores(Lista vertices, Grafo g, int profundidade);
 
 int calculaBonus(Vertice v, Lista irmaos, int profundidade);
 #endif
diff --git a/libs/lista.c b/libs/lista.c
index 9178c23..4a3eebb 100644
--- a/libs/lista.c
+++ b/libs/lista.c
@@ -20,7 +20,13 @@ unsigned int tamanhoLista(Lista l) { return l->tamanho; }
 // devolve o primeiro nó da Lista l,
 //      ou NULL, se l é vazia
 
-No primeiroNoLista(Lista l) { return l->primeiro; }
+No primeiroNoLista(Lista l) {
+    if(!l) return NULL;
+    if(l->tamanho == 0) {
+        return NULL;
+    }
+    return l->primeiro;
+}
 
 //---------------------------------------------------------------------------
 // cria uma Lista vazia e a devolve
diff --git a/libs/vertice.c b/libs/vertice.c
index 2dd4590..28dc7c0 100644
--- a/libs/vertice.c
+++ b/libs/vertice.c
@@ -11,6 +11,7 @@ Vertice criaVertice() {
     v->bonus = 0;
     v->altura = -1;
     v->grupo = false;
+    v->visitado = false;
     v->pais = constroiLista();
     v->filhos = constroiLista();
     return v;
diff --git a/libs/vertice.h b/libs/vertice.h
index c740ffc..fb225fb 100644
--- a/libs/vertice.h
+++ b/libs/vertice.h
@@ -9,6 +9,7 @@ struct Vertice {
     int bonus;
     int altura;
     bool grupo;
+    bool visitado;
     Lista pais;
     Lista filhos;
 };
-- 
GitLab


From def4e391dbfce739357135e71f50e72fab62c833 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Wed, 7 Jun 2017 11:34:52 -0300
Subject: [PATCH 05/20] =?UTF-8?q?Fun=C3=A7=C3=A3o=20agrupa=20agora=20s?=
 =?UTF-8?q?=C3=B3=20agrupa?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

TODO: arrumar o cálculo do bônus
---
 libs/jogador.c | 63 +++++++++++---------------------------------------
 libs/jogador.h |  4 ++--
 2 files changed, 16 insertions(+), 51 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index 33ab053..f6824e6 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 e3c8318..d5698a3 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
-- 
GitLab


From 4f7d6ae99a6f4c8b60f78e92f4c7689e32f04048 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Thu, 8 Jun 2017 11:09:31 -0300
Subject: [PATCH 06/20] =?UTF-8?q?B=C3=B4nus=20um=20pouco=20melhor?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Alguns que antes perdíamos agora não perdemos mais
---
 libs/jogador.c    | 130 ++++++++++++++++++++++++++++++++--------------
 libs/jogador.h    |   2 +-
 libs/vertice.h    |   2 +-
 tests/runTests.sh |   4 +-
 4 files changed, 96 insertions(+), 42 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index f6824e6..d7880cf 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -8,7 +8,6 @@
 
 Lista Joga(Grafo g, Lista grupo){
     Lista jogadas = constroiLista();
-    //TODO: A Logica toda do jogo vai ficar aqui
     int counter = 1;
     double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores;
     double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2);
@@ -17,31 +16,24 @@ Lista Joga(Grafo g, Lista grupo){
         int altura = calculaAltura(g, grupo);
 
         int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo);
-        int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos));
+        int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)));
+        // if(min <= 5) profundidade=altura;
 
-        // Pega os filhos do grupo
         Lista filhos = filhosGrupo(grupo);
-        // Monta a árvore de busca:
-        //      - RAIZ: 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
+
         // printf("\tJOGADA %d\n", counter);
+        // printf("\t\tProfundidade: %d\n", 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));
-        // printf("\tTamanho coresFilhos %d\n", tamanhoLista(coresFilhos));
-        // for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) {
-        //     Vertice v = (Vertice) getConteudo(n);
-        //     printf("\t\tVértice - cor: %d, peso: %d, bonus: %d\n", v->cor, v->peso, v->bonus);
+        calculaBonus(coresFilhos, g, profundidade);
+
+        // char prestr[32];
+        // sprintf(prestr, "./prejogada%d.out", counter);
+        // FILE* predebug = fopen(prestr, "w+");
+        // if(predebug) {
+        //     grafoParaDot(g, grupo, predebug);
         // }
-        // 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)
-        //      - Em caso de empate da soma peso + bônus:
-        //          - Escolher o filho que tem mais netos da mesma cor de um filho
-        // Após escolher um filho, repete o algoritmo até não terem mais filhos fora do grupo
+        // fclose(predebug);
+
 
         Vertice maior = (Vertice) getConteudo(primeiroNoLista(coresFilhos));
         for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) {
@@ -57,7 +49,7 @@ Lista Joga(Grafo g, Lista grupo){
         }
         // printf("\t\tCOR ESCOLHIDA: %d\n", maior->cor);
         insereLista(maior->cor, jogadas);
-        // "Pinta o tablueiro"
+
         for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) {
             Vertice v = (Vertice) getConteudo(n);
             if(v->cor == maior->cor && !v->grupo) {
@@ -66,19 +58,18 @@ Lista Joga(Grafo g, Lista grupo){
             }
         }
 
-        // Limpa as coisas
         destroiLista(filhos, NULL);
         destroiLista(coresFilhos, destroiVertice);
 
         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);
+        // char str[32];
+        // sprintf(str, "./jogada%d.out", counter );
+        // FILE* debug = fopen(str, "w+");
+        // if(debug) {
+        //     grafoParaDot(g, grupo, debug);
+        // }
+        // fclose(debug);
         ++counter;
     }
 
@@ -137,29 +128,92 @@ Lista agrupaCores(Lista vertices) {
     return agrupa;
 }
 
-// TODO: repensar calculo do bônus
-void calculaBonus(Lista grupo, int profundidade) {
+bool corEstaNaLista(Lista l, int cor) {
+    for(No n = primeiroNoLista(l); n; n = getSucessorNo(n)) {
+        Vertice v = (Vertice) getConteudo(n);
+        if(v->cor == cor) {
+             return true;
+        }
+    }
+    return false;
+}
+
+void calculaBonus(Lista grupo, Grafo g, int profundidade) {
     for(No n = primeiroNoLista(grupo); n; n = getSucessorNo(n)) {
         Vertice v = (Vertice) getConteudo(n);
+        v->bonus = 0;
         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);
+            if((filho->altura > v->altura)) {
+                int bonus = filho->peso + calculaBonusRec(filho, v, g, profundidade);
+                if(corEstaNaLista(grupo, filho->cor)) bonus += 100;
+                v->bonus += bonus;
             }
         }
+        Lista vFilhos = agrupaCores(v->filhos);
+        v->bonus += tamanhoLista(v->filhos) - tamanhoLista(vFilhos);
+        destroiLista(vFilhos, NULL);
+
+        int menorDistancia = v->altura;
+        for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) {
+            Vertice w = (Vertice) getConteudo(m);
+            if(w->grupo) continue;
+            if(w == v) continue;
+            if(w->cor == v->cor) {
+                if((w->altura < menorDistancia) || (menorDistancia == v->altura)) menorDistancia = w->altura;
+            }
+        }
+        v->bonus += (menorDistancia - v->altura)^2;
+
+        for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) {
+            Vertice pai = (Vertice) getConteudo(m);
+            pai->bonus = v->bonus;
+        }
     }
+
+    for(No n = primeiroNoLista(grupo); 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 consumido
+        //      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;
 }
 
-int calculaBonusRec(Vertice v, Vertice pai, int profundidade) {
+int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) {
     if(profundidade <= 0) return 0;
     int bonus = 0;
     for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) {
         Vertice filho = (Vertice) getConteudo(n);
+        if((filho->altura > v->altura)) {
+            int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1);
+            // for(No m = primeiroNoLista(g->vertices); m && (profundidade < 10); m = getSucessorNo(m)) {
+            //     Vertice w = (Vertice) getConteudo(m);
+            //     if(w == pai) continue;
+            //     if(!w->grupo) {
+            //         // Se existe alguém um nível acima da mesma cor...
+            //         if((w->altura == (filho->altura - 1)) && (w->cor == filho->cor)) {
+            //             // preBonus += 25;
+            //         }
+            //         // // Se existe alguém dois níves acima com a mesma cor
+            //         // else if((w->altura == (filho->altura - 2)) && (w->cor == filho->cor)) {
+            //         //     preBonus += 15;
+            //         // }
+            //     }
+            // }
 
-        if(!filho->grupo && !pertenceLista(filho, pai->filhos) && (filho->altura > v->altura)) {
-            bonus += filho->peso + calculaBonusRec(filho, v, profundidade-1);
+            bonus += preBonus;
         }
     }
     return v->bonus = bonus;
diff --git a/libs/jogador.h b/libs/jogador.h
index d5698a3..272b762 100644
--- a/libs/jogador.h
+++ b/libs/jogador.h
@@ -15,5 +15,5 @@ Lista filhosGrupo(Lista grupoPai);
 // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l
 Lista agrupaCores(Lista vertices);
 
-void calculaBonus(Lista grupo, int profundidade);
+void calculaBonus(Lista grupo, Grafo g, int profundidade);
 #endif
diff --git a/libs/vertice.h b/libs/vertice.h
index fb225fb..56336e9 100644
--- a/libs/vertice.h
+++ b/libs/vertice.h
@@ -6,7 +6,7 @@
 struct Vertice {
     int cor;
     int peso;
-    int bonus;
+    unsigned long int bonus;
     int altura;
     bool grupo;
     bool visitado;
diff --git a/tests/runTests.sh b/tests/runTests.sh
index ca61958..bf3fd84 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -48,8 +48,8 @@ do
             ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out
             ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out
             RESP=$(cat /tmp/resp.out | head -n1)
-            H1=$(cat /tmp/h1.out | head -n1)
-            H2=$(cat /tmp/h2.out | head -n1)
+            H1=$(cat /tmp/h1.out | tail -n2 | head -n1)
+            H2=$(cat /tmp/h2.out | tail -n2 | head -n1)
             if [ $RESP -gt $H1 ]; then
                 echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n"
                 echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt
-- 
GitLab


From 497a0827f0fbecd3170d8f9b3ac5b16427e69d44 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Thu, 8 Jun 2017 11:10:19 -0300
Subject: [PATCH 07/20] =?UTF-8?q?Add=20tabuleiros=20que=20agora=20d=C3=A3o?=
 =?UTF-8?q?=20erro?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore            |   1 +
 tests/tabuleiros2.out | 194 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 195 insertions(+)
 create mode 100644 tests/tabuleiros2.out

diff --git a/.gitignore b/.gitignore
index ce9f7b9..7354fa5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ tests/*.png
 massif.out*
 *.out
 !tests/tabuleiros.out
+!tests/tabuleiros2.out
diff --git a/tests/tabuleiros2.out b/tests/tabuleiros2.out
new file mode 100644
index 0000000..9b6ce91
--- /dev/null
+++ b/tests/tabuleiros2.out
@@ -0,0 +1,194 @@
+3 3 10 22600 (h1: 5)
+3 3 10 22600 (h2: 5)
+3 3 16 19040 (h1: 6)
+3 3 16 19040 (h2: 6)
+3 3 16 30956 (h1: 5)
+3 3 16 30956 (h2: 5)
+3 3 4 1930 (h1: 4)
+3 3 4 20600 (h1: 4)
+3 3 4 8366 (h1: 5)
+3 3 4 8366 (h2: 5)
+3 3 8 18977 (h1: 5)
+3 3 8 18977 (h2: 5)
+3 3 8 8012 (h1: 5)
+3 3 8 8012 (h2: 5)
+4 4 10 11135 (h1: 7)
+4 4 10 11135 (h2: 7)
+4 4 10 14928 (h1: 9)
+4 4 10 14928 (h2: 9)
+4 4 10 18375 (h2: 8)
+4 4 10 2070 (h1: 9)
+4 4 10 23470 (h2: 9)
+4 4 10 24772 (h2: 7)
+4 4 10 6283 (h2: 9)
+4 4 10 8479 (h2: 8)
+4 4 16 12402 (h2: 9)
+4 4 16 18295 (h1: 9)
+4 4 16 18295 (h2: 9)
+4 4 16 20112 (h1: 9)
+4 4 16 21473 (h2: 10)
+4 4 16 4696 (h2: 7)
+4 4 16 9419 (h2: 10)
+4 4 4 11579 (h1: 6)
+4 4 4 11579 (h2: 6)
+4 4 4 13320 (h1: 6)
+4 4 4 14064 (h1: 5)
+4 4 4 14064 (h2: 5)
+4 4 4 1611 (h1: 4)
+4 4 4 1611 (h2: 4)
+4 4 4 17232 (h1: 6)
+4 4 4 17232 (h2: 6)
+4 4 4 25522 (h1: 5)
+4 4 4 25522 (h2: 5)
+4 4 4 25820 (h2: 5)
+4 4 4 26508 (h2: 5)
+4 4 4 2835 (h1: 7)
+4 4 4 2835 (h2: 7)
+4 4 4 9524 (h1: 6)
+4 4 4 9639 (h1: 5)
+4 4 4 9639 (h2: 5)
+4 4 8 10019 (h1: 7)
+4 4 8 10019 (h1: 7)
+4 4 8 10019 (h2: 7)
+4 4 8 10019 (h2: 7)
+4 4 8 12901 (h1: 9)
+4 4 8 12901 (h2: 9)
+4 4 8 17301 (h1: 9)
+4 4 8 17301 (h2: 9)
+4 4 8 17998 (h2: 10)
+4 4 8 19156 (h1: 8)
+4 4 8 19156 (h2: 8)
+4 4 8 20112 (h1: 8)
+4 4 8 21593 (h1: 9)
+4 4 8 22108 (h2: 9)
+4 4 8 22780 (h2: 8)
+4 4 8 23041 (h1: 8)
+4 4 8 23041 (h2: 8)
+4 4 8 24658 (h1: 8)
+4 4 8 26632 (h1: 8)
+4 4 8 28676 (h1: 7)
+4 4 8 28676 (h2: 7)
+4 4 8 2955 (h1: 9)
+4 4 8 31369 (h1: 9)
+4 4 8 4677 (h1: 9)
+4 4 8 4677 (h2: 9)
+4 4 8 4927 (h2: 7)
+4 4 8 5649 (h1: 7)
+4 4 8 5649 (h2: 7)
+4 4 8 7834 (h1: 7)
+4 4 8 7834 (h2: 7)
+8 8 10 10366 (h1: 17)
+8 8 10 10366 (h2: 16)
+8 8 10 13138 (h1: 19)
+8 8 10 13439 (h2: 17)
+8 8 10 13765 (h1: 21)
+8 8 10 13992 (h2: 18)
+8 8 10 14350 (h1: 19)
+8 8 10 15850 (h2: 18)
+8 8 10 16457 (h2: 19)
+8 8 10 19856 (h2: 19)
+8 8 10 20352 (h2: 22)
+8 8 10 20571 (h2: 18)
+8 8 10 22262 (h2: 18)
+8 8 10 22774 (h2: 20)
+8 8 10 24320 (h1: 19)
+8 8 10 24633 (h1: 20)
+8 8 10 27756 (h2: 20)
+8 8 10 30292 (h1: 20)
+8 8 10 3083 (h2: 18)
+8 8 10 3113 (h1: 21)
+8 8 10 3358 (h1: 21)
+8 8 10 3358 (h2: 21)
+8 8 10 3821 (h1: 18)
+8 8 10 5659 (h1: 20)
+8 8 10 5659 (h2: 19)
+8 8 10 5674 (h1: 18)
+8 8 16 14476 (h2: 22)
+8 8 16 21413 (h1: 26)
+8 8 16 22007 (h1: 28)
+8 8 16 22007 (h2: 28)
+8 8 16 24721 (h1: 28)
+8 8 16 24721 (h2: 28)
+8 8 16 25688 (h2: 24)
+8 8 16 32360 (h2: 26)
+8 8 16 4205 (h1: 24)
+8 8 16 5987 (h2: 25)
+8 8 16 721 (h2: 27)
+8 8 16 8509 (h2: 24)
+8 8 16 8998 (h2: 24)
+8 8 4 11036 (h2: 8)
+8 8 4 11154 (h2: 10)
+8 8 4 12695 (h2: 9)
+8 8 4 137 (h1: 10)
+8 8 4 137 (h2: 10)
+8 8 4 15454 (h1: 8)
+8 8 4 16065 (h1: 9)
+8 8 4 16721 (h2: 9)
+8 8 4 17457 (h2: 10)
+8 8 4 18390 (h2: 10)
+8 8 4 18416 (h2: 9)
+8 8 4 19768 (h2: 10)
+8 8 4 20348 (h2: 10)
+8 8 4 22393 (h1: 10)
+8 8 4 23132 (h2: 10)
+8 8 4 23741 (h1: 9)
+8 8 4 24629 (h2: 8)
+8 8 4 25573 (h1: 6)
+8 8 4 2594 (h2: 10)
+8 8 4 27070 (h2: 9)
+8 8 4 27841 (h1: 9)
+8 8 4 30356 (h2: 10)
+8 8 4 3432 (h2: 9)
+8 8 4 3813 (h2: 9)
+8 8 4 4010 (h2: 9)
+8 8 4 4243 (h2: 7)
+8 8 4 5895 (h2: 10)
+8 8 4 7902 (h1: 9)
+8 8 4 7902 (h2: 9)
+8 8 4 8800 (h2: 9)
+8 8 4 9400 (h2: 11)
+8 8 8 10174 (h1: 16)
+8 8 8 1081 (h2: 16)
+8 8 8 12147 (h2: 16)
+8 8 8 14142 (h2: 15)
+8 8 8 15843 (h2: 19)
+8 8 8 15926 (h2: 16)
+8 8 8 17466 (h1: 19)
+8 8 8 17466 (h2: 17)
+8 8 8 18847 (h1: 16)
+8 8 8 18847 (h2: 16)
+8 8 8 21161 (h2: 18)
+8 8 8 22073 (h1: 19)
+8 8 8 22137 (h1: 16)
+8 8 8 22539 (h2: 18)
+8 8 8 22587 (h1: 17)
+8 8 8 25730 (h2: 17)
+8 8 8 27212 (h2: 18)
+8 8 8 27763 (h2: 15)
+8 8 8 28275 (h1: 17)
+8 8 8 30297 (h2: 15)
+8 8 8 30606 (h2: 17)
+8 8 8 4983 (h1: 18)
+8 8 8 4983 (h2: 18)
+8 8 8 5201 (h2: 16)
+8 8 8 5384 (h2: 17)
+8 8 8 7086 (h1: 18)
+8 8 8 9756 (h1: 15)
+16 16 10 32616 (h2: 42)
+16 16 10 6780 (h2: 39)
+16 16 4 13965 (h1: 15)
+16 16 4 14363 (h2: 15)
+16 16 4 14531 (h2: 15)
+16 16 4 14836 (h2: 20)
+16 16 4 17640 (h2: 21)
+16 16 4 18264 (h1: 18)
+16 16 4 29199 (h2: 15)
+16 16 4 3692 (h2: 15)
+16 16 4 4421 (h1: 17)
+16 16 4 8795 (h2: 16)
+16 16 4 9696 (h2: 17)
+32 32 4 11862 (h2: 31)
+32 32 4 19445 (h2: 31)
+32 32 4 24151 (h2: 36)
+32 32 4 26052 (h2: 34)
+32 32 4 27565 (h1: 34)
-- 
GitLab


From 692f14a1d48abf0cf0ab34ca2719479847e1c852 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Thu, 8 Jun 2017 11:33:59 -0300
Subject: [PATCH 08/20] =?UTF-8?q?Melhorando=20fun=C3=A7=C3=A3o=20que=20d?=
 =?UTF-8?q?=C3=A1=20b=C3=B4nus?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/jogador.c | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index d7880cf..ee8d15d 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -151,7 +151,23 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) {
             }
         }
         Lista vFilhos = agrupaCores(v->filhos);
-        v->bonus += tamanhoLista(v->filhos) - tamanhoLista(vFilhos);
+        v->bonus += (tamanhoLista(v->filhos) - tamanhoLista(vFilhos))*2;
+        // TODO: Se os filhos do grupo vão acabar na próxima jogada, dar bonus
+        // tabuleiro 3 3 4 1930
+        for(No m = primeiroNoLista(vFilhos); m; m = getSucessorNo(m)) {
+            Vertice w = (Vertice) getConteudo(m);
+            int somaCor = 0;
+            for(No o = primeiroNoLista(g->vertices); o; o = getSucessorNo(o)) {
+                Vertice x = (Vertice) getConteudo(o);
+                if(x->grupo) continue;
+                if(x->cor == w->cor) {
+                    somaCor += x->peso;
+                }
+            }
+            if(w->peso == somaCor) {
+                w->bonus += 150;
+            }
+        }
         destroiLista(vFilhos, NULL);
 
         int menorDistancia = v->altura;
@@ -184,8 +200,9 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) {
         //      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
+            v->bonus += 250; // Mais bonus para que essa cor seja a escolhida
         }
+
     }
 
     return;
@@ -198,21 +215,6 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) {
         Vertice filho = (Vertice) getConteudo(n);
         if((filho->altura > v->altura)) {
             int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1);
-            // for(No m = primeiroNoLista(g->vertices); m && (profundidade < 10); m = getSucessorNo(m)) {
-            //     Vertice w = (Vertice) getConteudo(m);
-            //     if(w == pai) continue;
-            //     if(!w->grupo) {
-            //         // Se existe alguém um nível acima da mesma cor...
-            //         if((w->altura == (filho->altura - 1)) && (w->cor == filho->cor)) {
-            //             // preBonus += 25;
-            //         }
-            //         // // Se existe alguém dois níves acima com a mesma cor
-            //         // else if((w->altura == (filho->altura - 2)) && (w->cor == filho->cor)) {
-            //         //     preBonus += 15;
-            //         // }
-            //     }
-            // }
-
             bonus += preBonus;
         }
     }
-- 
GitLab


From c6bc1880c4228366027e00f3e81f69cde18bb65d Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Thu, 8 Jun 2017 11:38:47 -0300
Subject: [PATCH 09/20] =?UTF-8?q?Add=20mais=20tabuleiros=20que=20d=C3=A3o?=
 =?UTF-8?q?=20errado?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 tests/tabuleiros2.out | 148 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 148 insertions(+)

diff --git a/tests/tabuleiros2.out b/tests/tabuleiros2.out
index 9b6ce91..a55a515 100644
--- a/tests/tabuleiros2.out
+++ b/tests/tabuleiros2.out
@@ -192,3 +192,151 @@
 32 32 4 24151 (h2: 36)
 32 32 4 26052 (h2: 34)
 32 32 4 27565 (h1: 34)
+3 3 4 18761 (h1: 5)
+3 3 4 18761 (h2: 5)
+3 3 4 24397 (h1: 4)
+3 3 4 24397 (h2: 4)
+3 3 4 6764 (h1: 4)
+3 3 4 6764 (h2: 4)
+3 3 8 27050 (h2: 5)
+4 4 10 12057 (h1: 9)
+4 4 10 12057 (h2: 9)
+4 4 10 13522 (h1: 9)
+4 4 10 13522 (h2: 9)
+4 4 10 26187 (h1: 8)
+4 4 10 460 (h1: 10)
+4 4 10 460 (h2: 10)
+4 4 4 14247 (h1: 6)
+4 4 4 14247 (h2: 6)
+4 4 4 15919 (h1: 5)
+4 4 4 15919 (h2: 5)
+4 4 4 17320 (h1: 6)
+4 4 4 17320 (h2: 6)
+4 4 4 19855 (h2: 5)
+4 4 4 21364 (h1: 6)
+4 4 4 21364 (h2: 6)
+4 4 4 22172 (h1: 7)
+4 4 4 22172 (h2: 7)
+4 4 4 23024 (h1: 6)
+4 4 4 23973 (h1: 5)
+4 4 4 23973 (h2: 5)
+4 4 4 25004 (h1: 6)
+4 4 4 26671 (h1: 6)
+4 4 4 26671 (h2: 6)
+4 4 4 30115 (h1: 5)
+4 4 4 30160 (h1: 7)
+4 4 4 30160 (h2: 7)
+4 4 4 31044 (h1: 6)
+4 4 4 31044 (h2: 6)
+4 4 4 31751 (h1: 5)
+4 4 4 4124 (h1: 5)
+4 4 4 8414 (h1: 6)
+4 4 4 8414 (h2: 6)
+4 4 4 9605 (h1: 6)
+4 4 4 9605 (h2: 6)
+4 4 4 972 (h1: 7)
+4 4 4 972 (h2: 7)
+4 4 8 10442 (h2: 7)
+4 4 8 18768 (h2: 9)
+4 4 8 22889 (h2: 9)
+4 4 8 25600 (h1: 7)
+4 4 8 25600 (h2: 7)
+4 4 8 28631 (h1: 9)
+4 4 8 28631 (h2: 9)
+4 4 8 29725 (h1: 8)
+4 4 8 29725 (h2: 8)
+4 4 8 3201 (h1: 7)
+4 4 8 3201 (h2: 7)
+4 4 8 5994 (h1: 8)
+4 4 8 5994 (h2: 8)
+4 4 8 9291 (h1: 9)
+4 4 8 9291 (h2: 9)
+8 8 10 19855 (h1: 23)
+8 8 10 21834 (h2: 17)
+8 8 10 21859 (h2: 17)
+8 8 10 22691 (h2: 18)
+8 8 10 25784 (h2: 20)
+8 8 10 30669 (h2: 17)
+8 8 10 32652 (h2: 18)
+8 8 10 5426 (h2: 20)
+8 8 10 5972 (h2: 20)
+8 8 4 10155 (h1: 11)
+8 8 4 10155 (h2: 11)
+8 8 4 1051 (h2: 10)
+8 8 4 11565 (h2: 9)
+8 8 4 11880 (h1: 9)
+8 8 4 11880 (h2: 9)
+8 8 4 13820 (h2: 10)
+8 8 4 14100 (h2: 9)
+8 8 4 14528 (h2: 10)
+8 8 4 15967 (h2: 10)
+8 8 4 16122 (h2: 8)
+8 8 4 16129 (h1: 11)
+8 8 4 16129 (h2: 11)
+8 8 4 17637 (h2: 9)
+8 8 4 18285 (h2: 8)
+8 8 4 18490 (h2: 11)
+8 8 4 19159 (h2: 9)
+8 8 4 19465 (h1: 11)
+8 8 4 19465 (h2: 11)
+8 8 4 20298 (h2: 8)
+8 8 4 20542 (h1: 8)
+8 8 4 20542 (h2: 8)
+8 8 4 22039 (h2: 11)
+8 8 4 22714 (h2: 9)
+8 8 4 22778 (h2: 9)
+8 8 4 23635 (h2: 9)
+8 8 4 24537 (h2: 10)
+8 8 4 2516 (h1: 9)
+8 8 4 25421 (h2: 12)
+8 8 4 26162 (h2: 11)
+8 8 4 28920 (h2: 9)
+8 8 4 29070 (h2: 9)
+8 8 4 3038 (h1: 8)
+8 8 4 3038 (h2: 8)
+8 8 4 32082 (h2: 10)
+8 8 4 32295 (h1: 9)
+8 8 4 32295 (h2: 9)
+8 8 4 6072 (h2: 11)
+8 8 4 6546 (h2: 12)
+8 8 4 7653 (h1: 8)
+8 8 4 7674 (h2: 10)
+8 8 4 8593 (h2: 12)
+8 8 4 8713 (h1: 9)
+8 8 4 8713 (h2: 9)
+8 8 4 9963 (h2: 11)
+8 8 8 16365 (h2: 17)
+8 8 8 17006 (h2: 17)
+8 8 8 17072 (h2: 17)
+8 8 8 20290 (h2: 17)
+8 8 8 21573 (h2: 15)
+8 8 8 25051 (h2: 17)
+8 8 8 25544 (h1: 18)
+8 8 8 30072 (h1: 17)
+8 8 8 30977 (h2: 17)
+8 8 8 5008 (h2: 15)
+8 8 8 6761 (h2: 16)
+16 16 4 1308 (h2: 17)
+16 16 4 14758 (h2: 17)
+16 16 4 16610 (h2: 16)
+16 16 4 19109 (h2: 20)
+16 16 4 22066 (h2: 17)
+16 16 4 26835 (h2: 18)
+16 16 4 28186 (h2: 14)
+16 16 4 32029 (h2: 15)
+16 16 4 3351 (h1: 19)
+16 16 4 3351 (h2: 18)
+16 16 4 4113 (h2: 16)
+16 16 4 4581 (h1: 18)
+16 16 4 5002 (h2: 18)
+16 16 4 6765 (h2: 18)
+16 16 4 9558 (h2: 18)
+16 16 8 18547 (h2: 32)
+32 32 4 1200 (h2: 28)
+32 32 4 14382 (h2: 32)
+32 32 4 16897 (h2: 32)
+32 32 4 17065 (h2: 28)
+32 32 4 21166 (h2: 34)
+32 32 4 29283 (h2: 33)
+32 32 4 30020 (h2: 28)
+32 32 4 3836 (h2: 35)
-- 
GitLab


From 8f02a3e270b16cf4dbaf0bb33316481b3d90a941 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Thu, 8 Jun 2017 19:04:11 -0300
Subject: [PATCH 10/20] Muda os testes

---
 tests/runTests.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/runTests.sh b/tests/runTests.sh
index bf3fd84..039e32a 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -4,10 +4,10 @@
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(3 4 8 16 32)
+tams=(3 4 8 16 32 64 100)
 
 # lista de cores
-cores=(4 8 10 16)
+cores=(2 3 4 6 8 10)
 
 #-- Cores do terminal
 RED='\033[0;31m'
-- 
GitLab


From 27fe2f7532aaf2c465470ef05ed6d8ea20f72027 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Thu, 8 Jun 2017 21:11:32 -0300
Subject: [PATCH 11/20] =?UTF-8?q?Add=20outras=20heur=C3=ADsticas?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 tests/floodit_h4  | Bin 0 -> 31136 bytes
 tests/floodit_h6  | Bin 0 -> 31160 bytes
 tests/runTests.sh |  14 ++++++++++++++
 3 files changed, 14 insertions(+)
 create mode 100755 tests/floodit_h4
 create mode 100755 tests/floodit_h6

diff --git a/tests/floodit_h4 b/tests/floodit_h4
new file mode 100755
index 0000000000000000000000000000000000000000..3b606ce4fb8e2b333d64c7db83c6f92d9e70b106
GIT binary patch
literal 31136
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

literal 0
HcmV?d00001

diff --git a/tests/floodit_h6 b/tests/floodit_h6
new file mode 100755
index 0000000000000000000000000000000000000000..5c679dea1db91e3e11db8bdd54099df9f8c4dc17
GIT binary patch
literal 31160
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
Zbpc2rsC>g_e?b;VmVx0rT7iRZKLE@Om~j9A

literal 0
HcmV?d00001

diff --git a/tests/runTests.sh b/tests/runTests.sh
index 039e32a..2944336 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -47,9 +47,13 @@ do
             T_soma_total=$(($T_gasto + $T_soma_total))
             ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out
             ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out
+            ./floodit_h4 < "/tmp/${semente}.in" > /tmp/h4.out
+            ./floodit_h6 < "/tmp/${semente}.in" > /tmp/h6.out
             RESP=$(cat /tmp/resp.out | head -n1)
             H1=$(cat /tmp/h1.out | tail -n2 | head -n1)
             H2=$(cat /tmp/h2.out | tail -n2 | head -n1)
+            H4=$(cat /tmp/h4.out | tail -n2 | head -n1)
+            H6=$(cat /tmp/h6.out | tail -n2 | head -n1)
             if [ $RESP -gt $H1 ]; then
                 echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n"
                 echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt
@@ -58,6 +62,14 @@ do
                 echo -ne "${RED}Heurística h2 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H2} e nós em ${RESP}${NC}\n"
                 echo "${i} ${i} ${cor} ${semente} (h2: ${H2})" >> tabuleiros.txt
             fi
+            if [ $RESP -gt $H4 ]; then
+                echo -ne "${RED}Heurística h4 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H4} e nós em ${RESP}${NC}\n"
+                echo "${i} ${i} ${cor} ${semente} (h4: ${H4})" >> tabuleiros.txt
+            fi
+            if [ $RESP -gt $H6 ]; then
+                echo -ne "${RED}Heurística h6 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H6} e nós em ${RESP}${NC}\n"
+                echo "${i} ${i} ${cor} ${semente} (h6: ${H6})" >> tabuleiros.txt
+            fi
             # tempo em segundos
             S=$(($T_gasto/1000000000))
             # tempo em milisegundos
@@ -74,6 +86,8 @@ do
             rm "/tmp/resp.out"
             rm "/tmp/h1.out"
             rm "/tmp/h2.out"
+            rm "/tmp/h4.out"
+            rm "/tmp/h6.out"
         done
         T_medio_cor=$(($T_soma_cor/${N_TESTES}))
         S_medio_cor=$(($T_medio_cor/1000000000))
-- 
GitLab


From 0eda296787ffc44a5867aeb0a01542640e46bd10 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Fri, 9 Jun 2017 01:59:43 -0300
Subject: [PATCH 12/20] Muda os testes (de novo)

---
 .gitlab-ci.yml    | 73 +++++++++++++++++++++++++++++++++++++++++++++--
 Makefile          |  6 ----
 tests/runTests.sh | 58 ++++++++++++++++++-------------------
 3 files changed, 98 insertions(+), 39 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dffaf75..e73fae9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,11 +6,78 @@ before_script:
     - apt-get -y install build-essential make autoconf gcc gnuplot
     - make
 
-test:
+h1:
     stage: test
-    script:
-        - make test
+    script: 
         - cd tests
+        - gcc -std=c99 -o test geraMapa.c
+        - chmod +x runTests.sh
+        - ./runTests.sh -h "./floodit_h1"
+        - gnuplot "tempos.plot"
+        - gnuplot "medias.plot"
+        - gnuplot "piores.plot"
+    artifacts:
+        paths:
+            - tests/tabuleiros.txt
+            - tests/tempos.txt
+            - tests/medias.txt
+            - tests/piores.txt
+            - tests/tempos.png
+            - tests/medias.png
+            - tests/piores.png
+    tags:
+        - ubuntu
+h2:
+    stage: test
+    script: 
+        - cd tests
+        - gcc -std=c99 -o test geraMapa.c
+        - chmod +x runTests.sh
+        - ./runTests.sh -h "./floodit_h2"
+        - gnuplot "tempos.plot"
+        - gnuplot "medias.plot"
+        - gnuplot "piores.plot"
+    artifacts:
+        paths:
+            - tests/tabuleiros.txt
+            - tests/tempos.txt
+            - tests/medias.txt
+            - tests/piores.txt
+            - tests/tempos.png
+            - tests/medias.png
+            - tests/piores.png
+    tags:
+        - ubuntu
+
+h4:
+    stage: test
+    script: 
+        - cd tests
+        - gcc -std=c99 -o test geraMapa.c
+        - chmod +x runTests.sh
+        - ./runTests.sh -h "./floodit_h4"
+        - gnuplot "tempos.plot"
+        - gnuplot "medias.plot"
+        - gnuplot "piores.plot"
+    artifacts:
+        paths:
+            - tests/tabuleiros.txt
+            - tests/tempos.txt
+            - tests/medias.txt
+            - tests/piores.txt
+            - tests/tempos.png
+            - tests/medias.png
+            - tests/piores.png
+    tags:
+        - ubuntu
+
+h6:
+    stage: test
+    script: 
+        - cd tests
+        - gcc -std=c99 -o test geraMapa.c
+        - chmod +x runTests.sh
+        - ./runTests.sh -h "./floodit_h6"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
         - gnuplot "piores.plot"
diff --git a/Makefile b/Makefile
index 1f81904..6871ea6 100644
--- a/Makefile
+++ b/Makefile
@@ -4,12 +4,6 @@ CFLAGS = -std=c99 -O2 -W -Wall -g
 
 all: main
 
-test: main
-	cd tests; \
-	$(CC) -std=c99 -o test geraMapa.c; \
-	chmod +x runTests.sh; \
-	./runTests.sh
-
 main: main.c libs/jogador.o libs/tabuleiro.o libs/grafo.o libs/vertice.o libs/filha.o libs/lista.o libs/no.o
 	$(CC) $(CFLAGS) -o $@ $^ -lm
 
diff --git a/tests/runTests.sh b/tests/runTests.sh
index 2944336..bc517cd 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -1,10 +1,29 @@
 #!/bin/bash
 
+OPTIND=1
+MAIN="../main"
+HEUR="./floodit_h6"
+
+while getopts ":m:h:" opt; do
+    case "$opt" in
+        m)  MAIN=$OPTARG
+            ;;
+        h)  HEUR=$OPTARG
+            ;;
+    esac
+done
+
+shift $((OPTIND-1))
+[ "$1" = "--" ] && shift
+
+echo $MAIN
+echo $HEUR
+
 # tempo máximo para executar, em milisegundos
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(3 4 8 16 32 64 100)
+tams=(32 64 100)
 
 # lista de cores
 cores=(2 3 4 6 8 10)
@@ -41,34 +60,16 @@ do
             # echo "Usando semente: ${semente}"
             ./test $i $i $cor $semente
             T_inicial=$(date +%s%N)
-            ../main < "/tmp/${semente}.in" > /tmp/resp.out
+            eval $MAIN < "/tmp/${semente}.in" > /tmp/resp.out
             T_gasto=$(($(date +%s%N) - $T_inicial))
             T_soma_cor=$(($T_gasto + $T_soma_cor))
             T_soma_total=$(($T_gasto + $T_soma_total))
-            ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out
-            ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out
-            ./floodit_h4 < "/tmp/${semente}.in" > /tmp/h4.out
-            ./floodit_h6 < "/tmp/${semente}.in" > /tmp/h6.out
-            RESP=$(cat /tmp/resp.out | head -n1)
-            H1=$(cat /tmp/h1.out | tail -n2 | head -n1)
-            H2=$(cat /tmp/h2.out | tail -n2 | head -n1)
-            H4=$(cat /tmp/h4.out | tail -n2 | head -n1)
-            H6=$(cat /tmp/h6.out | tail -n2 | head -n1)
-            if [ $RESP -gt $H1 ]; then
-                echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n"
-                echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt
-            fi
-            if [ $RESP -gt $H2 ]; then
-                echo -ne "${RED}Heurística h2 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H2} e nós em ${RESP}${NC}\n"
-                echo "${i} ${i} ${cor} ${semente} (h2: ${H2})" >> tabuleiros.txt
-            fi
-            if [ $RESP -gt $H4 ]; then
-                echo -ne "${RED}Heurística h4 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H4} e nós em ${RESP}${NC}\n"
-                echo "${i} ${i} ${cor} ${semente} (h4: ${H4})" >> tabuleiros.txt
-            fi
-            if [ $RESP -gt $H6 ]; then
-                echo -ne "${RED}Heurística h6 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H6} e nós em ${RESP}${NC}\n"
-                echo "${i} ${i} ${cor} ${semente} (h6: ${H6})" >> tabuleiros.txt
+            eval $HEUR < "/tmp/${semente}.in" > /tmp/heur.out
+            RESP=$(cat /tmp/resp.out | tail -n2 | head -n1)
+            HRESP=$(cat /tmp/heur.out | tail -n2 | head -n1)
+            if [ $RESP -gt $HRESP ]; then
+                echo -ne "${RED}Heurística ${HEUR} fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n"
+                echo "${i} ${i} ${cor} ${semente} (${H1})" >> tabuleiros.txt
             fi
             # tempo em segundos
             S=$(($T_gasto/1000000000))
@@ -84,10 +85,7 @@ do
             # fi
             rm "/tmp/${semente}.in"
             rm "/tmp/resp.out"
-            rm "/tmp/h1.out"
-            rm "/tmp/h2.out"
-            rm "/tmp/h4.out"
-            rm "/tmp/h6.out"
+            rm "/tmp/heur.out"
         done
         T_medio_cor=$(($T_soma_cor/${N_TESTES}))
         S_medio_cor=$(($T_medio_cor/1000000000))
-- 
GitLab


From fdd9484354cc952a6b2ff2fdbe343b329a5e5b99 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Fri, 9 Jun 2017 13:20:37 -0300
Subject: [PATCH 13/20] Tentando deixar melhor

Harder
Better
Faster
Stronger
---
 .gitlab-ci.yml    | 16 ++++++++--------
 libs/jogador.c    |  8 +++++---
 tests/runTests.sh | 39 ++++++++++++++++++++++-----------------
 3 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e73fae9..d1af058 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,7 +8,7 @@ before_script:
 
 h1:
     stage: test
-    script: 
+    script:
         - cd tests
         - gcc -std=c99 -o test geraMapa.c
         - chmod +x runTests.sh
@@ -18,7 +18,7 @@ h1:
         - gnuplot "piores.plot"
     artifacts:
         paths:
-            - tests/tabuleiros.txt
+            - tests/tabuleiros*.txt
             - tests/tempos.txt
             - tests/medias.txt
             - tests/piores.txt
@@ -29,7 +29,7 @@ h1:
         - ubuntu
 h2:
     stage: test
-    script: 
+    script:
         - cd tests
         - gcc -std=c99 -o test geraMapa.c
         - chmod +x runTests.sh
@@ -39,7 +39,7 @@ h2:
         - gnuplot "piores.plot"
     artifacts:
         paths:
-            - tests/tabuleiros.txt
+            - tests/tabuleiros*.txt
             - tests/tempos.txt
             - tests/medias.txt
             - tests/piores.txt
@@ -51,7 +51,7 @@ h2:
 
 h4:
     stage: test
-    script: 
+    script:
         - cd tests
         - gcc -std=c99 -o test geraMapa.c
         - chmod +x runTests.sh
@@ -61,7 +61,7 @@ h4:
         - gnuplot "piores.plot"
     artifacts:
         paths:
-            - tests/tabuleiros.txt
+            - tests/tabuleiros*.txt
             - tests/tempos.txt
             - tests/medias.txt
             - tests/piores.txt
@@ -73,7 +73,7 @@ h4:
 
 h6:
     stage: test
-    script: 
+    script:
         - cd tests
         - gcc -std=c99 -o test geraMapa.c
         - chmod +x runTests.sh
@@ -83,7 +83,7 @@ h6:
         - gnuplot "piores.plot"
     artifacts:
         paths:
-            - tests/tabuleiros.txt
+            - tests/tabuleiros*.txt
             - tests/tempos.txt
             - tests/medias.txt
             - tests/piores.txt
diff --git a/libs/jogador.c b/libs/jogador.c
index ee8d15d..d92e656 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -11,13 +11,13 @@ Lista Joga(Grafo g, Lista grupo){
     int counter = 1;
     double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores;
     double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2);
+    if (min < 1) min = 1;
     while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) {
         // Calcula a altura
         int altura = calculaAltura(g, grupo);
 
         int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo);
         int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)));
-        // if(min <= 5) profundidade=altura;
 
         Lista filhos = filhosGrupo(grupo);
 
@@ -160,12 +160,13 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) {
             for(No o = primeiroNoLista(g->vertices); o; o = getSucessorNo(o)) {
                 Vertice x = (Vertice) getConteudo(o);
                 if(x->grupo) continue;
+                if(x->altura < w->altura) continue;
                 if(x->cor == w->cor) {
                     somaCor += x->peso;
                 }
             }
             if(w->peso == somaCor) {
-                w->bonus += 150;
+                v->bonus += 150;
             }
         }
         destroiLista(vFilhos, NULL);
@@ -200,7 +201,7 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) {
         //      for igual ao peso do vértice agrupado, esta é a
         //      última jogada com aquela cor
         if(v->peso == somaCor) {
-            v->bonus += 250; // Mais bonus para que essa cor seja a escolhida
+            v->bonus += 350; // Mais bonus para que essa cor seja a escolhida
         }
 
     }
@@ -215,6 +216,7 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) {
         Vertice filho = (Vertice) getConteudo(n);
         if((filho->altura > v->altura)) {
             int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1);
+            Lista fFilhos = agrupaCores(filho->filhos);
             bonus += preBonus;
         }
     }
diff --git a/tests/runTests.sh b/tests/runTests.sh
index bc517cd..02fa15e 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -23,7 +23,7 @@ echo $HEUR
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(32 64 100)
+tams=(3 4 8 16)
 
 # lista de cores
 cores=(2 3 4 6 8 10)
@@ -35,7 +35,9 @@ BLUE='\033[0;34m'
 CYAN='\033[0;36m'
 NC='\033[0m' # Sem cor
 
-echo -ne "" > tabuleiros.txt
+TABULEIROS="tabuleiros_$(basename ${HEUR}).txt"
+
+echo -ne "" > $TABULEIROS
 echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > tempos.txt
 echo -ne "#Tam tabuleiro\t#Tempo médio\n" > medias.txt
 echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > piores.txt
@@ -57,20 +59,26 @@ do
             printf "%03d" $(($T_max_cor/1000000%1000))
             echo -ne ")"\\r
             semente=$RANDOM
-            # echo "Usando semente: ${semente}"
             ./test $i $i $cor $semente
+
             T_inicial=$(date +%s%N)
-            eval $MAIN < "/tmp/${semente}.in" > /tmp/resp.out
+
+            eval $MAIN < "/tmp/${semente}.in" > "/tmp/resp${semente}.out"
+
             T_gasto=$(($(date +%s%N) - $T_inicial))
             T_soma_cor=$(($T_gasto + $T_soma_cor))
             T_soma_total=$(($T_gasto + $T_soma_total))
-            eval $HEUR < "/tmp/${semente}.in" > /tmp/heur.out
-            RESP=$(cat /tmp/resp.out | tail -n2 | head -n1)
-            HRESP=$(cat /tmp/heur.out | tail -n2 | head -n1)
+
+            eval $HEUR < "/tmp/${semente}.in" > "/tmp/heur${semente}.out"
+
+            RESP=$(cat "/tmp/resp${semente}.out" | tail -n2 | head -n1)
+            HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1)
+
             if [ $RESP -gt $HRESP ]; then
-                echo -ne "${RED}Heurística ${HEUR} fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n"
-                echo "${i} ${i} ${cor} ${semente} (${H1})" >> tabuleiros.txt
+                echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n"
+                echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS}
             fi
+
             # tempo em segundos
             S=$(($T_gasto/1000000000))
             # tempo em milisegundos
@@ -79,13 +87,10 @@ do
             if [ $T_max_cor -lt $T_gasto ]; then
                 T_max_cor=$T_gasto
             fi
-            # if (($M>$tempo_max)); then
-            #     echo -e "\n${RED}Tabuleiro ${i} ${i} ${cor} ${semente} levou mais de ${tempo_max} milisegundos: ${S}.${M}s${NC}"
-            #     echo "${i} ${i} ${cor} ${semente}" >> tabuleiros.txt
-            # fi
+
             rm "/tmp/${semente}.in"
-            rm "/tmp/resp.out"
-            rm "/tmp/heur.out"
+            rm "/tmp/resp${semente}.out"
+            rm "/tmp/heur${semente}.out"
         done
         T_medio_cor=$(($T_soma_cor/${N_TESTES}))
         S_medio_cor=$(($T_medio_cor/1000000000))
@@ -105,10 +110,10 @@ do
     echo -e "${i}\t${M_medio_total}" >> medias.txt
 done
 
-fs=$(cat tabuleiros.txt | wc -l)
+fs=$(cat "${TABULEIROS}" | wc -l)
 if [ ${fs} -gt "1" ]; then
     echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}"
-    cat tabuleiros.txt
+    cat ${TABULEIROS}
     exit 1
 else
     echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}"
-- 
GitLab


From 739bf3de3506d382bdacbdc3cc28e26ee86c1c4d Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Fri, 9 Jun 2017 22:06:16 -0300
Subject: [PATCH 14/20] =?UTF-8?q?Muda=20o=20status=20da=20sa=C3=ADda=20do?=
 =?UTF-8?q?=20arquivo=20de=20teste?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 tests/runTests.sh | 2 --
 1 file changed, 2 deletions(-)

diff --git a/tests/runTests.sh b/tests/runTests.sh
index 02fa15e..6da7fb7 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -114,8 +114,6 @@ fs=$(cat "${TABULEIROS}" | wc -l)
 if [ ${fs} -gt "1" ]; then
     echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}"
     cat ${TABULEIROS}
-    exit 1
 else
     echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}"
-    exit 0
 fi
-- 
GitLab


From 347c044bcc15a3fb4fa11eb3d0dc52d30815576b Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Mon, 12 Jun 2017 10:27:08 -0300
Subject: [PATCH 15/20] =?UTF-8?q?Modifica=20raz=C3=A3o=20da=20profundidade?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/jogador.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index d92e656..91ed395 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -17,7 +17,7 @@ Lista Joga(Grafo g, Lista grupo){
         int altura = calculaAltura(g, grupo);
 
         int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo);
-        int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)));
+        int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * 1); //(altura/sqrt(naoConsumidos)));
 
         Lista filhos = filhosGrupo(grupo);
 
@@ -44,6 +44,10 @@ 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) {
+                    if(v->cor < maior->cor) {
+                        maior = v;
+                    }
                 }
             }
         }
@@ -146,7 +150,7 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) {
             Vertice filho = (Vertice) getConteudo(m);
             if((filho->altura > v->altura)) {
                 int bonus = filho->peso + calculaBonusRec(filho, v, g, profundidade);
-                if(corEstaNaLista(grupo, filho->cor)) bonus += 100;
+                if(corEstaNaLista(grupo, filho->cor)) bonus += 50;
                 v->bonus += bonus;
             }
         }
@@ -169,7 +173,7 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) {
                 v->bonus += 150;
             }
         }
-        destroiLista(vFilhos, NULL);
+        destroiLista(vFilhos, destroiVertice);
 
         int menorDistancia = v->altura;
         for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) {
@@ -180,7 +184,6 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) {
                 if((w->altura < menorDistancia) || (menorDistancia == v->altura)) menorDistancia = w->altura;
             }
         }
-        v->bonus += (menorDistancia - v->altura)^2;
 
         for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) {
             Vertice pai = (Vertice) getConteudo(m);
@@ -216,7 +219,6 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) {
         Vertice filho = (Vertice) getConteudo(n);
         if((filho->altura > v->altura)) {
             int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1);
-            Lista fFilhos = agrupaCores(filho->filhos);
             bonus += preBonus;
         }
     }
-- 
GitLab


From 7f10cb8dc05e6d9c027ed2b1f02b7d80c0bfd28f Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Mon, 12 Jun 2017 12:01:33 -0300
Subject: [PATCH 16/20] =?UTF-8?q?Algumas=20mudan=C3=A7as=20na=20profundida?=
 =?UTF-8?q?de?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/jogador.c    | 4 +++-
 tests/runTests.sh | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index 91ed395..3f86f45 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -17,7 +17,9 @@ Lista Joga(Grafo g, Lista grupo){
         int altura = calculaAltura(g, grupo);
 
         int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo);
-        int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * 1); //(altura/sqrt(naoConsumidos)));
+        double razao = (altura/sqrt(naoConsumidos));
+        int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao);
+        if(profundidade < 1) profundidade = 1;
 
         Lista filhos = filhosGrupo(grupo);
 
diff --git a/tests/runTests.sh b/tests/runTests.sh
index 6da7fb7..42978d0 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -23,7 +23,7 @@ echo $HEUR
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(3 4 8 16)
+tams=(8 16 32)
 
 # lista de cores
 cores=(2 3 4 6 8 10)
-- 
GitLab


From bbdd9248f68bd298435be12869c2c870b91d0660 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sun, 18 Jun 2017 01:44:35 -0300
Subject: [PATCH 17/20] =?UTF-8?q?Muda=20testes,=20arruma=20aloca=C3=A7?=
 =?UTF-8?q?=C3=A3o?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 libs/jogador.c    |  1 -
 tests/runTests.sh | 23 +++++++++++++++++------
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/libs/jogador.c b/libs/jogador.c
index d92e656..8cce92d 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -216,7 +216,6 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) {
         Vertice filho = (Vertice) getConteudo(n);
         if((filho->altura > v->altura)) {
             int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1);
-            Lista fFilhos = agrupaCores(filho->filhos);
             bonus += preBonus;
         }
     }
diff --git a/tests/runTests.sh b/tests/runTests.sh
index 6da7fb7..2b09c06 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -23,10 +23,10 @@ echo $HEUR
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(3 4 8 16)
+tams=(4 8 16 32)
 
 # lista de cores
-cores=(2 3 4 6 8 10)
+cores=(4 8 10)
 
 #-- Cores do terminal
 RED='\033[0;31m'
@@ -52,12 +52,15 @@ do
         echo "Número de cores: ${cor}"
         T_soma_cor=0
         T_max_cor=0
-        N_TESTES=500
+        N_TESTES=100
+        VIT=0
+        EMP=0
+        DER=0
         for j in $(seq 1 ${N_TESTES})
         do
             echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))."
             printf "%03d" $(($T_max_cor/1000000%1000))
-            echo -ne ")"\\r
+            echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r
             semente=$RANDOM
             ./test $i $i $cor $semente
 
@@ -75,10 +78,18 @@ do
             HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1)
 
             if [ $RESP -gt $HRESP ]; then
-                echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n"
+                #echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n"
                 echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS}
+                DER=$(($DER + 1))
+            fi
+            if [ $RESP -eq $HRESP ]; then
+                #echo -ne "${BLUE}Empatamos com $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP}${NC}\n"
+                EMP=$(($EMP + 1))
+            fi
+            if [ $RESP -lt $HRESP ]; then
+                #echo -ne "${GREEN}Ganhamos de  $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} com ${RESP}${NC}\n"
+                VIT=$(($VIT + 1))
             fi
-
             # tempo em segundos
             S=$(($T_gasto/1000000000))
             # tempo em milisegundos
-- 
GitLab


From 9a9172edbcc1221d6bb856f58eaaf37bb03785e5 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sun, 18 Jun 2017 12:50:26 -0300
Subject: [PATCH 18/20] =?UTF-8?q?Add=20passo=20para=20verificar=20a=20sa?=
 =?UTF-8?q?=C3=ADda?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitlab-ci.yml    |  11 +++--------
 tests/runTests.sh |  16 +++++++++-------
 tests/verifica    | Bin 0 -> 31040 bytes
 3 files changed, 12 insertions(+), 15 deletions(-)
 create mode 100755 tests/verifica

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d1af058..780ad00 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,13 +5,14 @@ before_script:
     - apt-get update
     - apt-get -y install build-essential make autoconf gcc gnuplot
     - make
+    - chmod +x tests/runTests.sh
+    - chmod +x tests/verifica
+    - gcc -std=c99 -o tests/test tests/geraMapa.c
 
 h1:
     stage: test
     script:
         - cd tests
-        - gcc -std=c99 -o test geraMapa.c
-        - chmod +x runTests.sh
         - ./runTests.sh -h "./floodit_h1"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
@@ -31,8 +32,6 @@ h2:
     stage: test
     script:
         - cd tests
-        - gcc -std=c99 -o test geraMapa.c
-        - chmod +x runTests.sh
         - ./runTests.sh -h "./floodit_h2"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
@@ -53,8 +52,6 @@ h4:
     stage: test
     script:
         - cd tests
-        - gcc -std=c99 -o test geraMapa.c
-        - chmod +x runTests.sh
         - ./runTests.sh -h "./floodit_h4"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
@@ -75,8 +72,6 @@ h6:
     stage: test
     script:
         - cd tests
-        - gcc -std=c99 -o test geraMapa.c
-        - chmod +x runTests.sh
         - ./runTests.sh -h "./floodit_h6"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
diff --git a/tests/runTests.sh b/tests/runTests.sh
index 2b09c06..25207fc 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -23,7 +23,7 @@ echo $HEUR
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(4 8 16 32)
+tams=(64 100)
 
 # lista de cores
 cores=(4 8 10)
@@ -58,9 +58,6 @@ do
         DER=0
         for j in $(seq 1 ${N_TESTES})
         do
-            echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))."
-            printf "%03d" $(($T_max_cor/1000000%1000))
-            echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r
             semente=$RANDOM
             ./test $i $i $cor $semente
 
@@ -78,16 +75,17 @@ do
             HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1)
 
             if [ $RESP -gt $HRESP ]; then
-                #echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n"
                 echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS}
                 DER=$(($DER + 1))
             fi
             if [ $RESP -eq $HRESP ]; then
-                #echo -ne "${BLUE}Empatamos com $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP}${NC}\n"
                 EMP=$(($EMP + 1))
             fi
             if [ $RESP -lt $HRESP ]; then
-                #echo -ne "${GREEN}Ganhamos de  $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} com ${RESP}${NC}\n"
+                VALIDO=$(cat "/tmp/${semente}.in" "/tmp/resp${semente}.out" | ./verifica)
+                if [[ $VALIDO -eq 1 ]]; then
+                    echo -ne "${RED}Nossa resposta para ${i} ${i} ${cor} ${semente} não é válida!!!${NC}\n\n"
+                fi
                 VIT=$(($VIT + 1))
             fi
             # tempo em segundos
@@ -102,6 +100,10 @@ do
             rm "/tmp/${semente}.in"
             rm "/tmp/resp${semente}.out"
             rm "/tmp/heur${semente}.out"
+
+            echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))."
+            printf "%03d" $(($T_max_cor/1000000%1000))
+            echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r
         done
         T_medio_cor=$(($T_soma_cor/${N_TESTES}))
         S_medio_cor=$(($T_medio_cor/1000000000))
diff --git a/tests/verifica b/tests/verifica
new file mode 100755
index 0000000000000000000000000000000000000000..2e7509c77c7151258a56cf66fccd53a4b67ce349
GIT binary patch
literal 31040
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

literal 0
HcmV?d00001

-- 
GitLab


From 5b5fe6c3ab8d9f41a85a407f70fe52565faeeb92 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sun, 18 Jun 2017 13:34:21 -0300
Subject: [PATCH 19/20] Deixa altura da busca fixa

---
 .gitlab-ci.yml            |  58 ++++++++++++++++-
 libs/jogador.c            |  15 +++--
 tests/runTests.sh         |   4 +-
 tests/runTests.sh.example | 132 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 200 insertions(+), 9 deletions(-)
 create mode 100644 tests/runTests.sh.example

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 780ad00..da90b69 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,6 +5,7 @@ before_script:
     - apt-get update
     - apt-get -y install build-essential make autoconf gcc gnuplot
     - make
+    - mv tests/runTests.sh.example tests/runTests.sh
     - chmod +x tests/runTests.sh
     - chmod +x tests/verifica
     - gcc -std=c99 -o tests/test tests/geraMapa.c
@@ -13,6 +14,8 @@ h1:
     stage: test
     script:
         - cd tests
+        - sed -i -e 's/tams=()/tams=(4 8 16 32 64)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(3 4 6 8 10)/g' runTests.sh
         - ./runTests.sh -h "./floodit_h1"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
@@ -32,6 +35,8 @@ h2:
     stage: test
     script:
         - cd tests
+        - sed -i -e 's/tams=()/tams=(4 8 16 32 64)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(3 4 6 8 10)/g' runTests.sh
         - ./runTests.sh -h "./floodit_h2"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
@@ -47,11 +52,35 @@ h2:
             - tests/piores.png
     tags:
         - ubuntu
+h4-min:
+    stage: test
+    script:
+        - cd tests
+        - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh
+        - ./runTests.sh -h "./floodit_h4"
+        - gnuplot "tempos.plot"
+        - gnuplot "medias.plot"
+        - gnuplot "piores.plot"
+    artifacts:
+        paths:
+            - tests/tabuleiros*.txt
+            - tests/tempos.txt
+            - tests/medias.txt
+            - tests/piores.txt
+            - tests/tempos.png
+            - tests/medias.png
+            - tests/piores.png
+    tags:
+        - ubuntu
 
-h4:
+h4-max:
     stage: test
     script:
         - cd tests
+        - sed -i -e 's/tams=()/tams=(100)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(10)/g' runTests.sh
+        - sed -i -e 's/N_TESTES=100/N_TESTES=50/g' runTests.sh
         - ./runTests.sh -h "./floodit_h4"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
@@ -68,10 +97,35 @@ h4:
     tags:
         - ubuntu
 
-h6:
+h6-min:
+    stage: test
+    script:
+        - cd tests
+        - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh
+        - ./runTests.sh -h "./floodit_h6"
+        - gnuplot "tempos.plot"
+        - gnuplot "medias.plot"
+        - gnuplot "piores.plot"
+    artifacts:
+        paths:
+            - tests/tabuleiros*.txt
+            - tests/tempos.txt
+            - tests/medias.txt
+            - tests/piores.txt
+            - tests/tempos.png
+            - tests/medias.png
+            - tests/piores.png
+    tags:
+        - ubuntu
+
+h6-max:
     stage: test
     script:
         - cd tests
+        - sed -i -e 's/tams=()/tams=(100)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(10)/g' runTests.sh
+        - sed -i -e 's/N_TESTES=100/N_TESTES=50/g' runTests.sh
         - ./runTests.sh -h "./floodit_h6"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
diff --git a/libs/jogador.c b/libs/jogador.c
index 3f86f45..a0a2e1c 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -12,14 +12,19 @@ Lista Joga(Grafo g, Lista grupo){
     double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores;
     double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2);
     if (min < 1) min = 1;
+    int altura = calculaAltura(g, grupo);
+    int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo);
+    double razao = (altura/sqrt(naoConsumidos));
+    int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao);
+    if(profundidade < 1) profundidade = 1;
     while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) {
         // Calcula a altura
-        int altura = calculaAltura(g, grupo);
+        altura = calculaAltura(g, grupo);
 
-        int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo);
-        double razao = (altura/sqrt(naoConsumidos));
-        int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao);
-        if(profundidade < 1) profundidade = 1;
+        // int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo);
+        // double razao = (altura/sqrt(naoConsumidos))*1.5;
+        // int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao);
+        // if(profundidade < 1) profundidade = 1;
 
         Lista filhos = filhosGrupo(grupo);
 
diff --git a/tests/runTests.sh b/tests/runTests.sh
index 25207fc..f6e39d9 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -23,10 +23,10 @@ echo $HEUR
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(64 100)
+tams=(100)
 
 # lista de cores
-cores=(4 8 10)
+cores=(10)
 
 #-- Cores do terminal
 RED='\033[0;31m'
diff --git a/tests/runTests.sh.example b/tests/runTests.sh.example
new file mode 100644
index 0000000..60455b6
--- /dev/null
+++ b/tests/runTests.sh.example
@@ -0,0 +1,132 @@
+#!/bin/bash
+
+OPTIND=1
+MAIN="../main"
+HEUR="./floodit_h6"
+
+while getopts ":m:h:" opt; do
+    case "$opt" in
+        m)  MAIN=$OPTARG
+            ;;
+        h)  HEUR=$OPTARG
+            ;;
+    esac
+done
+
+shift $((OPTIND-1))
+[ "$1" = "--" ] && shift
+
+echo $MAIN
+echo $HEUR
+
+# tempo máximo para executar, em milisegundos
+tempo_max=120000 #120s
+
+# tamanhos do tabuleiro
+tams=()
+
+# lista de cores
+cores=()
+
+#-- Cores do terminal
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+BLUE='\033[0;34m'
+CYAN='\033[0;36m'
+NC='\033[0m' # Sem cor
+
+TABULEIROS="tabuleiros_$(basename ${HEUR}).txt"
+
+echo -ne "" > $TABULEIROS
+echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > tempos.txt
+echo -ne "#Tam tabuleiro\t#Tempo médio\n" > medias.txt
+echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > piores.txt
+
+echo "Iniciado testes"
+for i in ${tams[*]}
+do
+    echo "Tamanho do tabuleiro: ${i}"
+    T_soma_total=0
+    for cor in ${cores[*]}
+    do
+        echo "Número de cores: ${cor}"
+        T_soma_cor=0
+        T_max_cor=0
+        N_TESTES=100
+        VIT=0
+        EMP=0
+        DER=0
+        for j in $(seq 1 ${N_TESTES})
+        do
+            semente=$RANDOM
+            ./test $i $i $cor $semente
+
+            T_inicial=$(date +%s%N)
+
+            eval $MAIN < "/tmp/${semente}.in" > "/tmp/resp${semente}.out"
+
+            T_gasto=$(($(date +%s%N) - $T_inicial))
+            T_soma_cor=$(($T_gasto + $T_soma_cor))
+            T_soma_total=$(($T_gasto + $T_soma_total))
+
+            eval $HEUR < "/tmp/${semente}.in" > "/tmp/heur${semente}.out"
+
+            RESP=$(cat "/tmp/resp${semente}.out" | tail -n2 | head -n1)
+            HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1)
+
+            if [ $RESP -gt $HRESP ]; then
+                echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS}
+                DER=$(($DER + 1))
+            fi
+            if [ $RESP -eq $HRESP ]; then
+                EMP=$(($EMP + 1))
+            fi
+            if [ $RESP -lt $HRESP ]; then
+                VALIDO=$(cat "/tmp/${semente}.in" "/tmp/resp${semente}.out" | ./verifica)
+                if [[ $VALIDO -eq 1 ]]; then
+                    echo -ne "${RED}Nossa resposta para ${i} ${i} ${cor} ${semente} não é válida!!!${NC}\n\n"
+                fi
+                VIT=$(($VIT + 1))
+            fi
+            # tempo em segundos
+            S=$(($T_gasto/1000000000))
+            # tempo em milisegundos
+            M=$(($T_gasto/1000000))
+            # tempo máximo por cor
+            if [ $T_max_cor -lt $T_gasto ]; then
+                T_max_cor=$T_gasto
+            fi
+
+            rm "/tmp/${semente}.in"
+            rm "/tmp/resp${semente}.out"
+            rm "/tmp/heur${semente}.out"
+
+            echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))."
+            printf "%03d" $(($T_max_cor/1000000%1000))
+            echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r
+        done
+        T_medio_cor=$(($T_soma_cor/${N_TESTES}))
+        S_medio_cor=$(($T_medio_cor/1000000000))
+        M_medio_cor=$(($T_medio_cor/1000000))
+        echo -ne "\n${CYAN}Tempo médio com ${cor} cores: ${S_medio_cor}."
+        printf "%03d" $((${M_medio_cor}%1000))
+        echo -e "s (${T_medio_cor})${NC}\n"
+        echo -e "${i}\t${cor}\t${M_medio_cor}" >> tempos.txt
+        echo -e "${i}\t${cor}\t$(($T_max_cor/1000000))" >> piores.txt
+    done
+    T_medio_total=$(( $T_soma_total/(${N_TESTES} * ${#cores[*]}) ))
+    S_medio_total=$(($T_medio_total/1000000000))
+    M_medio_total=$(($T_medio_total/1000000))
+    echo -ne "${BLUE}Tempo médio com tamanho ${i}: ${S_medio_total}."
+    printf "%03d" $((${M_medio_total}%1000))
+    echo -e "s (${T_medio_total})${NC}\n"
+    echo -e "${i}\t${M_medio_total}" >> medias.txt
+done
+
+fs=$(cat "${TABULEIROS}" | wc -l)
+if [ ${fs} -gt "1" ]; then
+    echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}"
+    cat ${TABULEIROS}
+else
+    echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}"
+fi
-- 
GitLab


From ba184bf20658dbd318dd61aadaf79223e25a1235 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sun, 18 Jun 2017 13:49:42 -0300
Subject: [PATCH 20/20] Testes melhores

---
 .gitlab-ci.yml    | 8 ++++----
 tests/runTests.sh | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index da90b69..2d59eca 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -56,8 +56,8 @@ h4-min:
     stage: test
     script:
         - cd tests
-        - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh
-        - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh
+        - sed -i -e 's/tams=()/tams=(4 8 16 32)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(3 4 8 10)/g' runTests.sh
         - ./runTests.sh -h "./floodit_h4"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
@@ -101,8 +101,8 @@ h6-min:
     stage: test
     script:
         - cd tests
-        - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh
-        - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh
+        - sed -i -e 's/tams=()/tams=(4 8 16 32)/g' runTests.sh
+        - sed -i -e 's/cores=()/cores=(3 4 8 10)/g' runTests.sh
         - ./runTests.sh -h "./floodit_h6"
         - gnuplot "tempos.plot"
         - gnuplot "medias.plot"
diff --git a/tests/runTests.sh b/tests/runTests.sh
index f6e39d9..0e38b7a 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -23,7 +23,7 @@ echo $HEUR
 tempo_max=120000 #120s
 
 # tamanhos do tabuleiro
-tams=(100)
+tams=(64)
 
 # lista de cores
 cores=(10)
-- 
GitLab