package aima.core.environment.hidato; import aima.core.search.framework.GoalTest; /** * Clase que implementa la funcion que decide si las metas se cumplen en un estado dado o no * Puede contener atributos para saber cuales son las metas de este problema o estar incluidas en el estado. */ public class FuncionMetas implements GoalTest { public FuncionMetas(){ } public boolean isGoalState(Object state) { Estado estado = (Estado)state; /* Estado que se va a comprobar si es final */ int adyacenteNull=0; /* contador de casillas nulas */ /* bucles para contar la cantidad de nulls de la matriz */ 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++; } } } /* contador de casillas adyacentes con valor valido encontradas (casillas consecutivas) */ int adyacenteOK=0; for(int i= 0; i<estado.matrix.length; i++){ /* Recorrer matriz entera */ for (int j=0; j<estado.matrix[0].length; j++){ for(int n=i-1; n<=i+1; n++){ /* Recorrer casillas adyacentes para cada posicion de la matriz*/ for(int m=j-1; m<=j+1; m++){ if(!(n<0 || m<0 || n>=estado.matrix.length || m>=estado.matrix[0].length) /* controlar fuera de limites */ && estado.matrix[n][m]!=null /* posiciones nulas no se comprueban */ && estado.matrix[i][j]!=null && estado.matrix[i][j]!=estado.hidato_max){ /* al la casilla con el valor máximo no se le busca adyacente consecutivo porque no va a haber ninguno mayor */ if(estado.matrix[i][j]+1==estado.matrix[n][m] ){ adyacenteOK++; /* si alguno de los adyacentes es el consecutivo incrementa el contador */ } } } } /* si el contador + 1 (por el número maximo) es igual que el total de casillas con valor de la matriz (sin nulos), ha encontrado solución */ if(adyacenteOK+1==estado.matrix.length*estado.matrix[0].length-adyacenteNull){ System.out.println("fin: \n"+estado); return true; } } } return false; } }