From a4fc2530e30c2612c58463a94c23bde7dcaf7d8f Mon Sep 17 00:00:00 2001 From: Daniel Saad Date: Fri, 8 May 2026 15:18:32 -0300 Subject: [PATCH] adding solution with constant heap time --- ra-preguicosa/src/ac_constant_time_heap.c | 184 ++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 ra-preguicosa/src/ac_constant_time_heap.c diff --git a/ra-preguicosa/src/ac_constant_time_heap.c b/ra-preguicosa/src/ac_constant_time_heap.c new file mode 100644 index 0000000..47616c7 --- /dev/null +++ b/ra-preguicosa/src/ac_constant_time_heap.c @@ -0,0 +1,184 @@ +#include +#include +#define INF 0x3f3f3f3f +#define MAX 150000 +typedef struct node_t{ + int i; + int j; + int c; +}node_t; + +/*pantano*/ +char mesh[1001][1001]; +int custo[1002][1002]; +char calculado[1002][1002]; +int inserido[1002][1002]; +node_t filas[8][MAX]; +int contadoresInicio[8]; +int contadoresFim[8]; +int C,R; +int Cf,Rf,Ct,Rt; +int C1,R1,C2,R2; +int W; +int currentFila; + +/*Escova bit*/ +inline int get_int(){ + int ch, i; + while (((ch = getchar()) == ' ') || (ch == '\n')); + for (i = 0; ch >= '0' && ch <= '9'; ch = getchar() ) + i = 10 * i + (ch - '0'); + return i; +} + + +void insere(node_t no,int custo){ + int balde = custo%8; + inserido[no.i][no.j] = balde; + filas[balde][contadoresFim[balde]++] = no; +} + +int retira(node_t* aux){ + int start = currentFila; + while(contadoresInicio[currentFila]==contadoresFim[currentFila]){ + currentFila++; + if(currentFila==8) currentFila = 0; + if(currentFila==start) return(0); + } + *aux = filas[currentFila][contadoresInicio[currentFila]++]; + return(1); +} + +/*Funcao q testa os limites do tabuleiro e outras coisas + *do Dijkstra + */ +int testa(node_t current,int i,int j,int c){ + + int custoAtual = custo[current.i][current.j]; + node_t temp; + if(!(i<=R && i>=1 && j<=C && j>=1)){ + return(1); + } + + if(calculado[i][j]){ + return(1); + } + if(mesh[i][j]==0){ + /*relaxamento*/ + if(custoAtual+c < custo[i][j]){ + custo[i][j] = custoAtual+c; + /*insere normal*/ + temp.i = i; + temp.j = j; + temp.c = custo[i][j]; + insere(temp,(custo[i][j])); + } + return(1); + } + return(0); +} + + +int getFila(){ + int i; + for(i=0;i<8;i++){ + if(contadoresInicio[i] custo[aux.i][aux.j]) continue; + /*pega a frente de onda*/ + //~ calculado[aux.i][aux.j] = 1; + + /*Só faz sentido calcular o pulo mais distante + *de o pulo da frente tiver alagado + */ + + /*Superior*/ + if(!testa(aux,aux.i+1,aux.j,2)) + testa(aux,aux.i+2,aux.j,5); + + /*Diagonais*/ + if(!testa(aux,aux.i+1,aux.j-1,3)){ + testa(aux,aux.i+2,aux.j-2,7); + testa(aux,aux.i+2,aux.j-1,6); + testa(aux,aux.i+1,aux.j-2,6); + } + + /*Diagonais*/ + if(!testa(aux,aux.i+1,aux.j+1,3)){ + testa(aux,aux.i+2,aux.j+2,7); + testa(aux,aux.i+2,aux.j+1,6); + testa(aux,aux.i+1,aux.j+2,6); + } + + /*parte lateral*/ + + if(!testa(aux,aux.i,aux.j-1,2)) + testa(aux,aux.i,aux.j-2,5); + if(!testa(aux,aux.i,aux.j+1,2)) + testa(aux,aux.i,aux.j+2,5); + + /*parte de baixo*/ + if(!testa(aux,aux.i-1,aux.j,2)) + testa(aux,aux.i-2,aux.j,5); + /*Diagonais*/ + if(!testa(aux,aux.i-1,aux.j-1,3)){ + testa(aux,aux.i-2,aux.j-2,7); + testa(aux,aux.i-1,aux.j-2,6); + testa(aux,aux.i-2,aux.j-1,6); + } + + /*Diagonais*/ + if(!testa(aux,aux.i-1,aux.j+1,3)){ + testa(aux,aux.i-2,aux.j+2,7); + testa(aux,aux.i-2,aux.j+1,6); + testa(aux,aux.i-1,aux.j+2,6); + } + + } + if(custo[Rt][Ct]==INF){ + printf("impossible\n"); + } + else{ + printf("%d\n",custo[Rt][Ct]); + } + } + return(0); +} +