Exemple #1
0
 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());
 }
Exemple #2
0
  /**
   * 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;
  }