알고리즘/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");
}
}
반응형