private Puzzle encontrarMelhNodo() {
   Puzzle melhor;
   Puzzle test;
   if (lista.size() == 0) {
     melhor = (Puzzle) usados.elementAt(0);
   } else {
     melhor = (Puzzle) lista.elementAt(0);
   }
   for (int i = 1; i < lista.size(); i++) {
     test = (Puzzle) lista.get(i);
     int melhorHeu = melhor.getPerfundidade() + melhor.getHeuCurt();
     int tempHeu = test.getPerfundidade() + test.getHeuCurt();
     // quanto mais pequeno melhor
     if (tempHeu < melhorHeu) {
       melhor = test;
     }
   }
   return melhor;
 }
 private boolean expandiNos(Puzzle p) {
   int[] test;
   Puzzle temp;
   lista.remove(p);
   int parentID = usados.size();
   usados.add(p);
   // se heuristica = 0, esta no obejectivo
   if (p.getHeuCurt() == 0) {
     return false;
   }
   test = p.cima();
   temp = new Puzzle(test, p.eCurto(), p.getPerfundidade(), parentID);
   adicinarLista(temp);
   test = p.baixo();
   temp = new Puzzle(test, p.eCurto(), p.getPerfundidade(), parentID);
   adicinarLista(temp);
   test = p.esquerda();
   temp = new Puzzle(test, p.eCurto(), p.getPerfundidade(), parentID);
   adicinarLista(temp);
   test = p.direita();
   temp = new Puzzle(test, p.eCurto(), p.getPerfundidade(), parentID);
   adicinarLista(temp);
   return true;
 }