문제(출처: https://www.acmicpc.net/problem/13565)
< 침투 >
문제 풀이
바깥쪽에서 공급된 전류의 위치를 찾은 후 상하좌우를 탐색하여 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 _13565_ {
static int[] dx= {-1,1,0,0};
static int[] dy= {0,0,-1,1};
static Queue<int[]>queue;
static boolean flag, visited[][];
static int m,n, map[][];
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(bf.readLine());
m=Integer.parseInt(st.nextToken());
n=Integer.parseInt(st.nextToken());
map=new int[m][n];
visited=new boolean[m][n];
queue=new LinkedList<>();
flag=false;
for(int i=0; i<m; i++) {
String line=bf.readLine();
for(int j=0; j<n; j++) {
map[i][j]=line.charAt(j)-'0';
if(i==0 && map[i][j]==0) {
queue.add(new int[] {i,j});
visited[i][j]=true;
}
}
}
search();
if(flag) System.out.println("YES");
else System.out.println("NO");
}
private static void search() {
while(!queue.isEmpty()) {
int temp[]=queue.poll();
for(int i=0; i<4; i++) {
int x=temp[0]+dx[i];
int y=temp[1]+dy[i];
if(x>=0 && x<m && y>=0 && y<n) {
if(map[x][y]==0 && !visited[x][y]) { // 전류 통함
if(x==m-1) {
flag=true;
break;
}
visited[x][y]=true;
queue.add(new int[] {x,y});
}
}
}
if(flag) break;
}
}
}
- Main
- n, m 입력
- map : 섬유 물질 격자
- visited: 전류 방문 여부
- queue: 전류의 위치 저장
- flag: 전류가 안쪽까지 침투되었는지 확인
- 섬유 물질 격자 정보를 입력받으면서 가장 바깥쪽에서 전류가 공급된 위치를 찾아 queue에 저장해 준다.
- search() 함수 호출
- 전류의 침투 여부(flag)에 따라 정답 출력
- search
- queue에서 전류의 위치를 꺼내옴
- 상하좌우로 이동하여 격자 범위 안이며, 전류가 잘 통하는 흰색이고 아직 방문하지 않았다면 queue에 넣어준다. queue에 넣기 전에 안쪽까지 도달했다면 바로 종료해 준다.
생각🤔
bfs를 활용하여 쉽게 해결할 수 있었다.
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 1240_노드사이의 거리 (0) | 2023.01.15 |
---|---|
[Baekjoon] 6593_상범 빌딩 (0) | 2023.01.08 |
[Baekjoon] 16197_두 동전 (0) | 2022.12.26 |
[Baekjoon] 9019_DSLR (0) | 2022.12.23 |
[Baekjoon] 12919_A와 B 2 (0) | 2022.12.22 |