알고리즘/Baekjoon

[Baekjoon] #13460 구슬 탈출 2

개발생각11 2022. 6. 22. 19:07
반응형

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

class Point{
   int rx, ry, bx, by, count;
   
   Point(int rx, int ry, int bx, int by, int count){
      this.rx = rx;
      this.ry = ry;
      this.bx = bx;
      this.by = by;
      this.count = count;
   }
}

public class Main {
   static int[] dx = {1, 0 ,-1 ,0}; // 0 right 1 down 2 left 3 up
   static int[] dy = {0, 1, 0, -1};
   static char[][] map;
   static int N, M;
   
   public static void main(String[] args) throws IOException{
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String[] s = br.readLine().split(" ");
      N = Integer.parseInt(s[0]);
      M = Integer.parseInt(s[1]);
      map = new char[N][M];
      int rx, ry, bx, by;
      rx = ry = bx = by = 0;
      
      for(int i = 0; i < N; i++){
         String m = br.readLine();
         map[i] = m.toCharArray();
         
         for(int j = 0; j < M; j++){
            if(map[i][j] == 'R'){
               rx = j;
               ry = i;
            }else if(map[i][j] == 'B'){
               bx = j;
               by = i;
            }
         }
      }
      
      Queue<Point> q = new LinkedList<>();
      q.add(new Point(rx, ry, bx, by, 0));
      
      while(!q.isEmpty()){
         Point now = q.poll();
         
         if(now.count == 10) break;
         
         for(int i = 0; i < 4; i++){
            int nrx = now.rx;
            int nry = now.ry;
            int nbx = now.bx;
            int nby = now.by;
            
            while(map[nry + dy[i]][nrx + dx[i]] != '#'){
               nrx += dx[i];
               nry += dy[i];
 
               if(map[nry][nrx] == 'O')
                  break;
            }
            
            while(map[nby + dy[i]][nbx + dx[i]] != '#'){
               nbx += dx[i];
               nby += dy[i];
              
               if(map[nby][nbx] == 'O')
                  break;
            }
            
            if(map[nby][nbx] == 'O')
               continue;
            
            if(map[nry][nrx] == 'O'){
               System.out.println(now.count + 1);
               return;
            }
            
            // 0 right 1 down 2 left 3 up
            if(nrx == nbx && nry == nby){
               if(i == 0){
                  if(now.rx > now.bx)
                     nbx--;
                  else
                     nrx--;
               }else if(i == 1){
                  if(now.ry > now.by)
                     nby--;
                  else
                     nry--;
               }else if(i == 2){
                  if(now.rx < now.bx)
                     nbx++;
                  else
                     nrx++;
               }else{
                  if(now.ry < now.by)
                     nby++;
                  else
                     nry++;
               }
            }
            
            q.add(new Point(nrx, nry, nbx, nby, now.count + 1));
         }
      }
      
      System.out.println("-1");
   }
}
반응형