https://www.acmicpc.net/problem/16441
16441번: 아기돼지와 늑대
첫 번째 줄에는 격자의 행의 수를 나타내는 N (3 ≤ N ≤ 100) 과 격자의 열의 수를 나타내는 M (3 ≤ M ≤ 100) 이 주어집니다. 두 번째 줄부터 N개의 줄에 지도의 정보를 나타내는 길이가 M인 문자열
www.acmicpc.net
BFS 문제입니다.
얼음을 어떻게 미끄러져 갈 것인가, 그 후에 어떻게 할 것인가가 중요한 것 같습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static char[][] map;
static boolean[][] visited;
static int[] dr = { -1, 0, 1, 0 };
static int[] dc = { 0, 1, 0, -1 };
static Queue<int[]> q = new LinkedList<>();
public static void main(String[] args) throws Exception {
st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new char[N][M];
visited = new boolean[N][M];
for (int i = 0; i < N; i++) {
String line = br.readLine();
for (int j = 0; j < M; j++) {
map[i][j] = line.charAt(j);
if(map[i][j] == 'W') {
visited[i][j] = true;
q.offer(new int[] { i, j });
}
}
} // end of input
while(!q.isEmpty()) {
int[] now = q.poll();
for (int dir = 0; dir < 4; dir++) {
int nr = now[0] + dr[dir];
int nc = now[1] + dc[dir];
if(map[nr][nc] == '.' && !visited[nr][nc]) {
visited[nr][nc] = true;
q.offer(new int[] { nr, nc });
} else if(map[nr][nc] == '+') {
while(true) {
nr += dr[dir];
nc += dc[dir];
if(map[nr][nc] == '.') {
if(visited[nr][nc]) break;
visited[nr][nc] = true;
q.offer(new int[] { nr, nc });
break;
} else if(map[nr][nc] == '#') {
nr -= dr[dir];
nc -= dc[dir];
if(visited[nr][nc]) break;
visited[nr][nc] = true;
q.offer(new int[] { nr, nc });
break;
}
}
}
}
}
// 출력
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(map[i][j] == '#' || map[i][j] == '+' || map[i][j] == 'W') sb.append(map[i][j]);
else if(map[i][j] == '.' && visited[i][j]) sb.append('.');
else sb.append('P');
}
sb.append("\n");
}
System.out.print(sb.toString());
}
}
'OJ' 카테고리의 다른 글
[BOJ] 1726 로봇 (JAVA) (0) | 2022.12.26 |
---|---|
[BOJ] 1240 노드사이의 거리 (JAVA) (0) | 2022.12.25 |
[BOJ] 23254 나는 기말고사형 인간이야 (JAVA) (2) | 2022.12.22 |
[BOJ] 17834 사자와 토끼 (JAVA) (0) | 2022.12.20 |
[BOJ] 1600 말이 되고픈 원숭이 (JAVA) (0) | 2022.12.13 |