https://www.acmicpc.net/problem/29703
29703번: 펭귄의 하루
$1$ × $1$ 크기의 정사각형 칸으로 각각 나누어져 있는 $N$ × $M$의 행렬로 표현되는 펭귄 마을이 있다. 펭귄 마을의 정보는 문자 'S', 'H', 'E', 'D', 'F'로 나타난다. E는 천적이 없어 펭귄이 이동해도 괜
www.acmicpc.net
저는 bfs를 통해 문제를 해결하였습니다.
bfs로 모든 경로를 탐색하고 , 해당 경로에 F가 있는지도 확인하고 최단거리를 찾아 문제를 해결하였습니다.
package BOJ.bfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_29703 {
private static final int NOT_FOUND = -1;
private static final char START = 'S';
private static final char HOUSE = 'H';
private static final char EMPTY = 'E';
private static final char DANGER = 'D';
private static final char FISH = 'F';
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
char[][] map = new char[n][m];
int startY = 0;
int startX = 0;
for(int i = 0 ; i < n ; i++){
String command = br.readLine();
for(int j = 0 ; j < m ; j++){
map[i][j]= command.charAt(j);
if(map[i][j] == START){
startY = i;
startX = j;
}
}
}
int result = bfs(startY,startX,map,n,m);
System.out.println(result);
}
private static final int[] DY = {-1,0,1,0};
private static final int[] DX = {0,1,0,-1};
private static int bfs(int startY, int startX, char[][] map, int n, int m) {
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{startY,startX,0});
int time = 0;
boolean[][][] visited = new boolean[n][m][2];
while(!q.isEmpty()){
int qSize = q.size();
for(int s = 0 ; s < qSize ; s++){
int[] now = q.poll();
if(map[now[0]][now[1]] == HOUSE && now[2] == 1){
return time;
}
for(int i = 0 ; i < 4 ; i++){
int ny = now[0] + DY[i];
int nx = now[1] + DX[i];
int foundFish = now[2];
if(ny >= 0 && ny <n && nx >= 0 && nx < m && map[ny][nx] != DANGER && !visited[ny][nx][foundFish]){
if(map[ny][nx] == FISH){
foundFish = 1;
}
q.offer(new int[]{ny,nx,foundFish});
visited[ny][nx][foundFish] = true;
}
}
}
time++;
}
return NOT_FOUND;
}
}
'알고리즘' 카테고리의 다른 글
백준 14495번 피보나치 비스무리한 수열 (JAVA) (1) | 2023.10.11 |
---|---|
백준 14497번 주난의 난 (JAVA) (1) | 2023.10.10 |
백준 1251번 단어 나누기 (JAVA) (0) | 2023.10.08 |
백준 14607번 피자 (JAVA) (1) | 2023.10.07 |
백준 13699번 점화식 (JAVA) (0) | 2023.10.06 |