package aima.core.environment.hidato;
import aima.core.search.framework.HeuristicFunction;
public class Heuristica2 implements HeuristicFunction{
@Override
public double h(Object state) {
Estado estado = (Estado)state;
/* calcula casillas adyacentes nulas */
int adyacenteNull=0;
for(int i= 0; i<estado.matrix.length; i++){
for (int j=0; j<estado.matrix[0].length; j++){
if(estado.matrix[i][j]==null){
adyacenteNull++;
}
}
}
/* calcula casillas adyacentes que cumplen las condiciones del juego */
int adyacenteOK=0;
for(int i= 0; i<estado.matrix.length; i++){
for (int j=0; j<estado.matrix[0].length; j++){
for(int n=i-1; n<=i+1; n++){
for(int m=j-1; m<=j+1; m++){
if(!(n<0 || m<0 || n>=estado.matrix.length || m>=estado.matrix[0].length)
&& estado.matrix[n][m]!=null
&& estado.matrix[i][j]!=null
&& estado.matrix[i][j]!=estado.hidato_max){
if(estado.matrix[i][j]+1==estado.matrix[n][m] ){
adyacenteOK++;
}
}
}
}
}
}
/* hidato_rank. fórmula explicada en la memoria */
float accurate_heuristic = (1-((adyacenteOK+1)/(float)(estado.matrix.length*estado.matrix[0].length-adyacenteNull))*100);
return accurate_heuristic;
}
}