private boolean search(FreeCellNode node, int depthLimit) {
    if (System.currentTimeMillis() - timer >= 60000) {
      // if(FreeCellSolver.scoreNode((FreeCellNode) node) > score){
      //	System.out.println("Depth " + depthLimit + " node: " + node);
      // }
      return false;
    }
    nodeCount++;
    if (node.isGoal()) {
      goalNode = node;
      System.out.println(((FreeCellNode) goalNode).moveMade);
      return true;
    }
    if (depthLimit > 0) {
      for (SearchNode child : node.expand()) {
        if (!generationHashes.contains(((FreeCellNode) child).getHash())) {
          generationHashes.add(((FreeCellNode) child).getHash());
          int score = FreeCellScorer.scoreNode((FreeCellNode) child);
          if (score > bestScore && !previousHashes.contains(((FreeCellNode) child).getHash())) {
            // generationHashes.add(node.getHash());
            // System.out.println(generationHashes);
            bestScore = score;
            bestNode = (FreeCellNode) child;
          }

          if (search((FreeCellNode) child, depthLimit - 1)) {
            return true;
          } // else if (depthLimit == 1){
          //	if(FreeCellSolver.scoreNode((FreeCellNode) child) > score){
          //		score = FreeCellSolver.scoreNode((FreeCellNode) node);
          //		System.out.printf("D:%d S: %d \n", node.depth, score);
          //	}
          // }
        }
      }
    }
    //	else{
    //	int score = FreeCellSolver.scoreNode((FreeCellNode) node);
    //	if(score > bestScore){
    // generationHashes.add(node.getHash());
    // System.out.println(generationHashes);
    //	bestScore = score;
    //	bestNode = node;
    //	}
    // if(++nodeCount %1000 == 0)
    // System.out.println(nodeCount);
    // }
    return false;
  }