# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1146013 | mamaniever | Coin Collecting (JOI19_ho_t4) | Java | 0 ms | 0 KiB |
import java.util.*;
public class CoinCollectingBFS {
// Direcciones para moverse (arriba, abajo, izquierda, derecha)
private static final int[] DIR_X = {-1, 1, 0, 0};
private static final int[] DIR_Y = {0, 0, -1, 1};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt(); // Número de posiciones objetivo
List<int[]> coins = new ArrayList<>(); // Lista de posiciones de las monedas
// Leer las posiciones de las monedas
for (int i = 0; i < 2 * N; i++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
coins.add(new int[]{x, y});
}
// Generar las posiciones objetivo
List<int[]> targets = new ArrayList<>();
for (int i = 1; i <= N; i++) {
targets.add(new int[]{i, 1}); // Fila 1
targets.add(new int[]{i, 2}); // Fila 2
}
// Ordenar las monedas y los objetivos por coordenadas para emparejar eficientemente
coins.sort(Comparator.comparingInt(a -> a[0]));
targets.sort(Comparator.comparingInt(a -> a[0]));
// Calcular la suma de las distancias mínimas usando BFS
long totalOperations = 0;
for (int i = 0; i < 2 * N; i++) {
totalOperations += bfsDistance(coins.get(i), targets.get(i));
}
// Imprimir el resultado
System.out.println(totalOperations);
}
/**
* Calcula la distancia mínima entre dos celdas usando BFS.
*
* @param start Posición inicial de la moneda [x, y].
* @param target Posición objetivo [x, y].
* @return Distancia mínima entre la posición inicial y la posición objetivo.
*/
private static int bfsDistance(int[] start, int[] target) {
Queue<int[]> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();
queue.add(new int[]{start[0], start[1], 0}); // {x, y, distancia}
visited.add(start[0] + "," + start[1]);
while (!queue.isEmpty()) {
int[] current = queue.poll();
int x = current[0], y = current[1], distance = current[2];
// Si llegamos al objetivo, devolvemos la distancia
if (x == target[0] && y == target[1]) {
return distance;
}
// Explorar las celdas vecinas
for (int i = 0; i < 4; i++) {
int newX = x + DIR_X[i];
int newY = y + DIR_Y[i];
String key = newX + "," + newY;
// Agregar la nueva celda a la cola si no ha sido visitada
if (!visited.contains(key)) {
visited.add(key);
queue.add(new int[]{newX, newY, distance + 1});
}
}
}
return -1; // No debería llegar aquí
}
}