[Line]2019年上半期LINE実習生募集コードテスト


質問リンク

1.問題を理解する


実装+BFS使用最短時間の問題

2.問題分析


1.ブラウンが特定セルに到達した時刻:BFSに移動


2.ブラウンは特定の時間内にコンニが到着した格子内に到着できるかどうか:


  • ブラウンは2秒後に元の位置に戻ることができます.
    ex) 2 -> 1 -> 2

  • コンニが11秒でxに着いたら
    1,3,5,7,9,11秒に1回、ブラウンがその格子に着いたら、コンニを捕まえることができます.

  • コンニが10秒でxに着いたら
    0,2,4,6,8,10秒に一度、ブラウンがその格子に着いたら、彼を捕まえることができます.

  • したがって、到着時間を奇数と偶数に分ける必要があります.
  • 3.コード

    public class Main {
        static boolean[][] visited = new boolean[200_001][2];
        static final int even = 0, odd = 1;
        static Queue<Integer> q = new LinkedList<>();
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            int conyPosition = sc.nextInt();
            int brown = sc.nextInt();
    
            q.add(brown);
            visited[brown][even] = true;
            visited[brown][odd] = true;
    
            int time = 0;
            while(inRange(conyPosition)) {
                int timeRemainder = time%2;
    
                if(visited[conyPosition][timeRemainder]) {//끝
                    System.out.println(time);
                    return;
                }
    
                time++;
                conyPosition += time;
                updateNextBrown(q.size(), time);
            }
            
            System.out.println(-1);
        }
    
        public static void updateNextBrown(int size, int time) {
            for(int i = 0; i < size; i++) {
                int index = q.poll();
    
                int[] nextIndex = {index-1, index+1, index*2};
                int timeRemainder = time%2;
    
                for(int j = 0; j < 3; j++) {
                  int now = nextIndex[j];
                  if(inRange(now) && !visited[now][timeRemainder]) {
                      visited[now][timeRemainder] = true;
                      q.add(now);
                  }
                }
            }
        }
    
        public static boolean inRange(int num) {
            if(0 <= num && num <= 200_000) {
                return true;
            } else {
                return false;
            }
        }
    }