Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PriorityQueue<Node> search = new PriorityQueue<>(Comparator.comparingInt(Node::getTime));
- search.add(new Node(Tool.TORCH, 0, new Point(0, 0)));
- Set<Node> seen = new HashSet<>();
- while (!search.isEmpty()) {
- Node head = search.poll();
- if (head.getPos().equals(target) && head.getTool() == Tool.TORCH) {
- return new Result(risk, head.getTime());
- }
- Type type = typeCache.get(head.getPos());
- Set<Node> validNext = new LinkedHashSet<>();
- Direction[] valid = Direction.valid(head.getPos());
- for (Direction d : valid) {
- Node next = head.move(d);
- Type t = typeCache.computeIfAbsent(next.getPos(), p -> getType(erosionCache, p.getX(), p.getY()));
- if (t.canUse(next.getTool())) {
- validNext.add(next);
- }
- }
- if (validNext.size() < valid.length) {
- for (Tool tool : Tool.values()) {
- if (tool != head.getTool() && type.canUse(tool)) {
- validNext.add(head.withTool(tool));
- }
- }
- }
- validNext.removeIf(seen::contains);
- validNext.removeIf(n -> n.getPos().getX() > target.getX() + 1000 && n.getPos().getY() > target.getY() + 1000);
- seen.addAll(validNext);
- search.addAll(validNext);
- }
Advertisement
Add Comment
Please, Sign In to add comment