Submission #1147158

#TimeUsernameProblemLanguageResultExecution timeMemory
1147158lucianaftCoin Collecting (JOI19_ho_t4)Java
0 / 100
58 ms11344 KiB
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;

class Coin {
  static class Position {
    int x, y, moves;

    Position(int x, int y, int moves) {
      this.x = x;
      this.y = y;
      this.moves = moves;
    }
  }

  public static int minMovesToTarget(int N, int[][] coins) {
    List<Position> targets = new ArrayList<>();
    for (int x = 1; x <= N; x++) {
      targets.add(new Position(x, 1, 0));
      targets.add(new Position(x, 2, 0));
    }

    Arrays.sort(coins, Comparator.comparingInt(a -> a[0]));
    targets.sort(Comparator.comparingInt(a -> a.x));

    boolean[] usedTarget = new boolean[2 * N];
    int totalMoves = 0;

    for (int i = 0; i < 2 * N; i++) {
      int minDist = Integer.MAX_VALUE;
      int bestTarget = -1;
      for (int j = 0; j < targets.size(); j++) {
        if (!usedTarget[j]) {
          int dist = bfs(coins[i][0], coins[i][1], targets.get(j).x, targets.get(j).y);
          if (dist < minDist) {
            minDist = dist;
            bestTarget = j;
          }
        }
      }

      if (bestTarget != -1) {
        usedTarget[bestTarget] = true;
        totalMoves += minDist;
      }
    }

    return totalMoves;
  }

  private static int bfs(int startX, int startY, int targetX, int targetY) {
    if (startX == targetX && startY == targetY) return 0;

    Queue<Position> queue = new LinkedList<>();
    Set<String> visited = new HashSet<>();
    queue.add(new Position(startX, startY, 0));
    visited.add(startX + "," + startY);

    int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

    while (!queue.isEmpty()) {
      Position current = queue.poll();

      for (int[] dir : directions) {
        int newX = current.x + dir[0];
        int newY = current.y + dir[1];

        if (newX == targetX && newY == targetY) {
          return current.moves + 1;
        }

        String newState = newX + "," + newY;
        if (!visited.contains(newState)) {
          visited.add(newState);
          queue.add(new Position(newX, newY, current.moves + 1));
        }
      }
    }
    return Integer.MAX_VALUE;
  }

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int N = scanner.nextInt();
    int[][] coins = new int[2 * N][2];

    for (int i = 0; i < 2 * N; i++) {
      coins[i][0] = scanner.nextInt();
      coins[i][1] = scanner.nextInt();
    }

    System.out.println(minMovesToTarget(N, coins));
    scanner.close();
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...