제출 #527643

#제출 시각아이디문제언어결과실행 시간메모리
527643AstollfoMecho (IOI09_mecho)Java
컴파일 에러
0 ms0 KiB
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
    static int[] xBfs = {1, -1, 0, 0};
    static int[] yBfs = {0, 0, 1, -1};
    static int n;
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    n = sc.nextInt();
    int s = sc.nextInt();

    char[][] grid = new char[n][n];

    int[][] beeDistance = new int[n][n];
    boolean[][] beeVisited = new boolean[n][n];
    Queue<Coordinate> q = new LinkedList<>();
    Coordinate mecho = new Coordinate(-1, -1);
        for (int i = 0; i < n; i++) {
            String temp = sc.next();
            for (int j = 0; j < n; j++) {
                grid[i][j] = temp.charAt(j);
                if(grid[i][j] == 'M') {
                    mecho = new Coordinate(i, j);
                }
                else if(grid[i][j] == 'H') {//its a hive
                    q.add(new Coordinate(i, j));
                    beeDistance[i][j] = 0;
                    beeVisited[i][j] = true;
                }
            }
        }

        beeBFS(grid, beeDistance, beeVisited, q); //run bfs on bees

        q = new LinkedList<>(); //mecho bfs preparation
        q.add(new Coordinate(mecho.x, mecho.y));
        int[][] mechoDistance = new int[n][n];
        boolean[][] mechoVisited = new boolean[n][n];
        mechoVisited[mecho.x][mecho.y] = true;
        Coordinate[][] previousLocation = new Coordinate[n][n];
        previousLocation[mecho.x][mecho.y] = new Coordinate(-1, -1);

        mechoBFS(mechoDistance, mechoVisited, previousLocation, q, grid, beeDistance, beeVisited, s);        //mecho bfs
    }
    private static void mechoBFS(int[][] mechoDistance, boolean[][] mechoVisited,
                                 Coordinate[][] previousLocation, Queue<Coordinate> q, char[][] grid, int[][] beeDistance, boolean[][] beeVisited, int s) {
        //I need to actually write and not copy this part.
        boolean endThis = false;
        while(!q.isEmpty() && !endThis) {
            Coordinate c = q.poll();
            int x = c.x;
            int y = c.y;
            for (int i = 0; i < 4; i++) {
                int curX = x + xBfs[i];
                int curY = y + yBfs[i];
                if(onGrid(curX, curY) && !mechoVisited[curX][curY] && grid[curX][curY] != 'T') {
                    if(beeVisited[curX][curY] && ((mechoDistance[x][y] + 1) / s) < beeDistance[curX][curY]) {
                        mechoVisited[curX][curY] = true;
                        mechoDistance[curX][curY] = mechoDistance[x][y] + 1;
                        q.add(new Coordinate(curX, curY));
                        previousLocation[curX][curY] = new Coordinate(x, y);
                    }
                }

                if(onGrid(curX, curY) && grid[curX][curY] == 'D') { //we found the shortest path.
                        //all other paths from this point onwards is irrelevant.
                    findAnswer(mechoDistance, previousLocation, grid, beeDistance, s, new Coordinate(curX, curY));
                    endThis = true;
                }
                if(endThis) break;
            }
        }
    }

    private static void findAnswer(
            int[][] mechoDistance, Coordinate[][] previousLocation, char[][] grid,
            int[][] beeDistance, int mechoSpeed, Coordinate home) {
        //check if the current position is possible,
        //bees expand one position
        int waitTime = 0;
        boolean impossible = false;
        while(true) {
            Coordinate current = new Coordinate(home.x, home.y);
            while(current.x != -1 && current.y != -1) { //-1, -1 is the original honeypot
                if((mechoDistance[current.x][current.y] / mechoSpeed)
                        < (beeDistance[current.x][current.y] - waitTime)) {
                    int x = current.x;
                    int y = current.y;
                    current.x = previousLocation[x][y].x;
                    current.y = previousLocation[x][y].y;
                }

                else {
                    impossible = true;
                    break;
                }
            }
            if(impossible) break;
            waitTime++;
        }
        System.out.println(waitTime); //remember to implement -1...
    }

    private static void beeBFS(char[][] grid, int[][] beeDistance,
                               boolean[][] beeVisited, Queue<Coordinate> q) {
        while(!q.isEmpty()) {
            Coordinate c = q.poll();
            int x = c.x;
            int y = c.y;
            for (int i = 0; i < 4; i++) {
                int curX = x + xBfs[i];
                int curY = y + yBfs[i];
                if(onGrid(curX, curY) && !beeVisited[curX][curY] && grid[curX][curY] != 'T') {
                    beeVisited[curX][curY] = true;
                    beeDistance[curX][curY] = beeDistance[x][y] + 1;
                    q.add(new Coordinate(curX, curY));
                }
            }
        }
    }
    public static boolean onGrid(int x, int y) {
        return (x >= 0 && x < n && y >= 0 && y < n);
    }}
class Coordinate {
    int x, y;
    public Coordinate(int x, int y) {this. x = x; this.y = y;}
}

컴파일 시 표준 에러 (stderr) 메시지

mecho.java:4: error: class Main is public, should be declared in a file named Main.java
public class Main {
       ^
1 error