private boolean esDestino(Nodo current) { // como no nos piden ninguna restriccion ni optimizacion sobre la ultilizacion de powerup // los niveles de estos nodos no son tenidos en cuenta en el algoritmo de busqueda para // distinguir cuando llego a destino return (current.getX() == nodoDestino.getX()) && (current.getY() == nodoDestino.getY()); }
/** * Sea un nodo v(i,j,k) sus alcanzables directos son los nodos w de la forma (a, b, k) / ((i-c <= * a <= i+c) && (b==j)) || ((j-c <= b <= j+c) && (a==i)) && c = potencia(v) ahora , sea l una * variable que mueve en el rango [1..k] los nodos t de la forma (a, b, l) / ((a = i-c) || (a = * i+c) && (b==j)) || ((b = j-c) || (b = j+c) && (a==i)) && c = potencia(v) + l * * @param nodo * @param nodoValue * @return */ private List<Nodo> calcularAlcanzables(Nodo nodo, int nodoValue, int dimensionMatriz) { int currentLevel = nodo.getLevel(); int currentX = nodo.getX(); int currentY = nodo.getY(); int potenciaIntrinseca = nodoValue; LinkedList<Nodo> alcanzables = new LinkedList<Nodo>(); // armo los alcanzables directo for (int j = -potenciaIntrinseca; j <= potenciaIntrinseca; j++) { // validacion de bordes y que no sea el mismo if (validarBordes(dimensionMatriz, currentX, j)) { Nodo alcanzableDirecto = new Nodo(currentX + j, currentY, currentLevel); alcanzables.add(alcanzableDirecto); } // validacion de bordes y que no sea el mismo if (validarBordes(dimensionMatriz, currentY, j)) { Nodo alcanzableDirecto = new Nodo(currentX, currentY + j, currentLevel); alcanzables.add(alcanzableDirecto); } } // adiciono los alcanzables indirectos que surgen de utilizas unidadesDePowerUpAdicionadas // unidades de powerup for (int unidadesDePowerUpAdicionadas = 1; unidadesDePowerUpAdicionadas <= currentLevel; unidadesDePowerUpAdicionadas++) { int potenciaTotal = potenciaIntrinseca + unidadesDePowerUpAdicionadas; if (potenciaTotal > dimensionMatriz) { // fix para complejidad, de esta forma es O(dimension) todo el metodo. // si potenciaTotal > dimensionMatriz, validarBordes va a dar false, asi que ni hace falta // revisarlas // veamos que como potenciaIntrinseca > 0 para cualquier nodo, entonces si // unidadesDePowerUpAdicionadas > n-1 // entonces potenciaTotal > dimensionMatriz lo cual no tiene sentido, porque se podria // saltar por fuera de los limites de la matriz break; } if (validarBordes(dimensionMatriz, currentY, potenciaTotal)) { Nodo alcanzableIndirecto = new Nodo( currentX, currentY + potenciaTotal, currentLevel - unidadesDePowerUpAdicionadas); alcanzables.add(alcanzableIndirecto); } if (validarBordes(dimensionMatriz, currentY, -potenciaTotal)) { Nodo alcanzableIndirecto = new Nodo( currentX, currentY - potenciaTotal, currentLevel - unidadesDePowerUpAdicionadas); alcanzables.add(alcanzableIndirecto); } if (validarBordes(dimensionMatriz, currentX, potenciaTotal)) { Nodo alcanzableIndirecto = new Nodo( currentX + potenciaTotal, currentY, currentLevel - unidadesDePowerUpAdicionadas); alcanzables.add(alcanzableIndirecto); } if (validarBordes(dimensionMatriz, currentX, -potenciaTotal)) { Nodo alcanzableIndirecto = new Nodo( currentX - potenciaTotal, currentY, currentLevel - unidadesDePowerUpAdicionadas); alcanzables.add(alcanzableIndirecto); } } return alcanzables; }