제출 #1146908

#제출 시각아이디문제언어결과실행 시간메모리
1146908daniel_lopezCoin Collecting (JOI19_ho_t4)Java
0 / 100
81 ms12608 KiB
import java.util.*; public class joi2019_ho_t4 { static class State { List<Pair> coins; int moves; State(List<Pair> coins, int moves) { this.coins = coins; this.moves = moves; } } static class Pair { int x, y; Pair(int x, int y) { this.x = x; this.y = y; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Pair)) return false; Pair pair = (Pair) o; return x == pair.x && y == pair.y; } @Override public int hashCode() { return Objects.hash(x, y); } } static int[] dx = {-1, 0, 1, 0}; static int[] dy = {0, 1, 0, -1}; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); List<Pair> initialCoins = new ArrayList<>(); for (int i = 0; i < 2 * N; i++) { int x = sc.nextInt(); int y = sc.nextInt(); initialCoins.add(new Pair(x, y)); } int result = solveBFS(N, initialCoins); System.out.println(result); sc.close(); } static int solveBFS(int N, List<Pair> initialCoins) { Queue<State> queue = new LinkedList<>(); Set<String> visited = new HashSet<>(); queue.offer(new State(initialCoins, 0)); visited.add(getStateString(initialCoins)); while (!queue.isEmpty()) { State current = queue.poll(); if (isGoalState(current.coins, N)) { return current.moves; } for (int i = 0; i < current.coins.size(); i++) { Pair coin = current.coins.get(i); for (int dir = 0; dir < 4; dir++) { int newX = coin.x + dx[dir]; int newY = coin.y + dy[dir]; if (isValidMove(newX, newY, N, current.coins, i)) { List<Pair> newCoins = new ArrayList<>(current.coins); newCoins.set(i, new Pair(newX, newY)); String newState = getStateString(newCoins); if (!visited.contains(newState)) { visited.add(newState); queue.offer(new State(newCoins, current.moves + 1)); } } } } } return -1; } static boolean isValidMove(int x, int y, int N, List<Pair> coins, int excludeIndex) { if (x < -N || x > N || y < -N || y > N) return false; for (int i = 0; i < coins.size(); i++) { if (i == excludeIndex) continue; if (coins.get(i).x == x && coins.get(i).y == y) return false; } return true; } static boolean isGoalState(List<Pair> coins, int N) { for (Pair coin : coins) { if (coin.x < 1 || coin.x > N || coin.y < 1 || coin.y > 2) { return false; } } Set<Pair> uniqueCoins = new HashSet<>(coins); return uniqueCoins.size() == coins.size(); } static String getStateString(List<Pair> coins) { List<Pair> sortedCoins = new ArrayList<>(coins); sortedCoins.sort((a, b) -> a.x == b.x ? a.y - b.y : a.x - b.x); StringBuilder sb = new StringBuilder(); for (Pair coin : sortedCoins) { sb.append(coin.x).append(',').append(coin.y).append(';'); } return sb.toString(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...