문제(출처: https://www.acmicpc.net/problem/14940)
< 쉬운 최단거리>
문제 풀이
bfs로 모든 지점에 대해서 목표지점까지의 거리를 구하였다.
- my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _14940_ { // 쉬운 최단거리
static int arr[][], result[][], n, m;
static int dx[]= {-1,1,0,0};
static int dy[]= {0,0,-1,1};
static boolean visited[][];
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(bf.readLine());
// 지도의 크기
n=Integer.parseInt(st.nextToken());
m=Integer.parseInt(st.nextToken());
arr=new int[n][m]; // 지도
result=new int[n][m]; // 거리
visited=new boolean[n][m]; // 방문 여부
int x=0,y=0;
for(int i=0; i<n; i++) {
st=new StringTokenizer(bf.readLine());
for(int j=0; j<m; j++) {
arr[i][j]=Integer.parseInt(st.nextToken());
if(arr[i][j]==2) { // 목표 지점
x=i;
y=j;
}else if(arr[i][j]==0) visited[i][j]=true; // 갈 수 없는 땅
}
}
search(x,y);
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(!visited[i][j]) { // 도달할 수 없는 위치
result[i][j]=-1;
}
System.out.print(result[i][j]+" ");
}
System.out.println();
}
}
private static void search(int x, int y) {
Queue<int[]>queue=new LinkedList<>();
queue.add(new int[] {x,y});
visited[x][y]=true;
while(!queue.isEmpty()) {
int temp[]=queue.poll();
for(int i=0; i<4; i++) {
int a=temp[0]+dx[i];
int b=temp[1]+dy[i];
if(a>=0 && a< n && b>=0 && b<m) {
if(!visited[a][b] && arr[a][b]==1) {
visited[a][b]=true;
result[a][b]=result[temp[0]][temp[1]]+1;
queue.add(new int[] {a,b});
}
}
}
}
}
}
Main
- 지도의 크기 n, m 입력
- arr : 지도
- result : 모든 지점에 대해서 목표지점까지의 거리
- visited : 방문 여부
- 지도를 입력받으며 목표지점의 좌표를 구하고 갈 수 없는 땅은 미리 방문한 것으로 표시
- search 함수 호출
- 구한 목표지점까지의 거리를 출력하며 도달할 수 없는 위치를 -1로 바꿔 출력
search
- queue가 빌 때까지 반복하여 상하좌우 탐색 후 아직 방문하지 않았으며 갈 수 있는 땅이면 이동!
생각🤔
도달할 수 없는 위치를 -1로 바꾼다는 부분을 놓쳐서 틀렸다..
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 12761_돌다리 (0) | 2023.03.03 |
---|---|
[Baekjoon] 11123_양 한마리... 양 두마리... (0) | 2023.03.01 |
[Baekjoon] 18126_너구리 구구 (0) | 2023.02.26 |
[Baekjoon] 16174_점프왕 쩰리 (Large) (0) | 2023.02.24 |
[Baekjoon] 1756_피자 굽기 (0) | 2023.02.24 |