
전형적인 BFS문제 이전에 풀었던 미로탈출과 같은 문제이다 다른점은 한번에 끝까지 이동한다는점. 이것도 마찬가지로 우선순위큐를 사용할 필요가 없는데 가중치가 1이기 때문에 큐에 낮은값부터 빠져나오기 때문이다.
코드
import java.util.*;
class Solution {
boolean[][] visit;
public int solution(String[] board) {
char[][] map =new char[board.length][board[0].length()];
visit =new boolean[board.length][board[0].length()];
int[] start= new int[3];
for(int i=0;i<board.length;i++){
for(int j=0;j<board[0].length();j++){
map[i][j]=board[i].charAt(j);
if(board[i].charAt(j)=='R'){
map[i][j]='.';
start[0]=i;
start[1]=j;
}
}
}
int answer = 0;
answer=moveRobot(start,map);
return answer;
}
public int moveRobot(int[] start,char[][] map){
PriorityQueue<int[]> q = new PriorityQueue<>((o1,o2)->o1[2]-o2[2]);
// Queue<int[]> q = new LinkedList<>();
q.add(start);
visit[start[0]][start[1]]=true;
while(!q.isEmpty()){
int[] tmp=q.poll();
if(map[tmp[0]][tmp[1]]=='G') return tmp[2];
for(int i=0;i<4;i++){
int[] tmp2=move(i,tmp.clone(),map);
if(!visit[tmp2[0]][tmp2[1]]){
tmp2[2]++;
q.add(tmp2);
visit[tmp2[0]][tmp2[1]]=true;
}
}
}
return -1;
}
public int[] move(int i,int[] t,char[][] map){
boolean flag= true;
while(flag){
switch(i){
case 0:
if(t[0]+1<visit.length&&map[t[0]+1][t[1]]!='D'){
t[0]++;
}else flag=false;
break;
case 1:
if(t[0]-1>=0&&map[t[0]-1][t[1]]!='D'){
t[0]--;
}else flag=false;
break;
case 2:
if(t[1]+1<visit[0].length&&map[t[0]][t[1]+1]!='D'){
t[1]++;
}else flag=false;
break;
case 3:
if(t[1]-1>=0&&map[t[0]][t[1]-1]!='D'){
t[1]--;
}else flag=false;
break;
}
}
return t;
}
}