https://www.acmicpc.net/problem/11967
11967번: 불켜기
(1, 1)방에 있는 스위치로 (1, 2)방과 (1, 3)방의 불을 켤 수 있다. 그리고 (1, 3)으로 걸어가서 (2, 1)방의 불을 켤 수 있다. (2, 1)방에서는 다시 (2, 2)방의 불을 켤 수 있다. (2, 3)방은 어두워서 갈 수 없으
www.acmicpc.net
BFS 문제입니다.
불이 켜진 방으로만 진행할 수 있는데, 어떤 조건일 때 큐에 삽입할지 생각해보는 게 좋겠습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
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 int[] dr = { -1, 0, 1, 0 };
static int[] dc = { 0, 1, 0, -1};
static ArrayList<int[]>[][] list;
public static void main(String[] args) throws Exception {
st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
list = new ArrayList[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
list[i][j] = new ArrayList<>();
}
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int r = Integer.parseInt(st.nextToken()) - 1;
int c = Integer.parseInt(st.nextToken()) - 1;
int rr = Integer.parseInt(st.nextToken()) - 1;
int cc = Integer.parseInt(st.nextToken()) - 1;
list[r][c].add(new int[] { rr, cc });
} // end of input
int result = 1;
Queue<int[]> q = new LinkedList<>();
boolean[][] light = new boolean[N][N];
boolean[][] visited = new boolean[N][N];
light[0][0] = true;
visited[0][0] = true;
q.offer(new int[] { 0, 0 });
while(!q.isEmpty()) {
int[] now = q.poll();
// 다음으로 불을 켤 수 있는 방들에 대해
for (int[] next : list[now[0]][now[1]]) {
// 아직 불이 켜지지 않았다면
if(!light[next[0]][next[1]]) {
light[next[0]][next[1]] = true;
result++;
}
// 아직 방문하지 않았다면
if(!visited[next[0]][next[1]]) {
for (int dir = 0; dir < 4; dir++) {
int nr = next[0] + dr[dir];
int nc = next[1] + dc[dir];
if(0 <= nr && nr < N && 0 <= nc && nc < N && visited[nr][nc]) {
q.offer(new int[] { next[0], next[1] });
visited[next[0]][next[1]] = true;
}
}
}
}
for (int dir = 0; dir < 4; dir++) {
int nr = now[0] + dr[dir];
int nc = now[1] + dc[dir];
if(0 <= nr && nr < N && 0 <= nc && nc < N && !visited[nr][nc] && light[nr][nc]) {
q.offer(new int[] { nr, nc });
visited[nr][nc] = true;
}
}
}
System.out.print(result);
}
}
'OJ' 카테고리의 다른 글
[BOJ] 16930 달리기 (JAVA) (2) | 2023.01.08 |
---|---|
[BOJ] 5427 불 (JAVA) (0) | 2023.01.07 |
[BOJ] 16918 봄버맨 (JAVA) (0) | 2023.01.05 |
[BOJ] 1026 보물 (JAVA) (0) | 2023.01.04 |
[BOJ] 17182 우주 탐사선 (JAVA) (2) | 2023.01.03 |