반응형
https://www.acmicpc.net/problem/13565
13565번: 침투
첫째 줄에는 격자의 크기를 나타내는 M (2 ≤ M ≤ 1,000) 과 N (2 ≤ N ≤ 1,000) 이 주어진다. M줄에 걸쳐서, N개의 0 또는 1 이 공백 없이 주어진다. 0은 전류가 잘 통하는 흰색, 1은 전류가 통하지 않
www.acmicpc.net
[ 문제풀이 ]
1. 격자를 입력받고, 격자의 y 좌표가 0인 좌표의 arr 값이 '0'이라면 queue에 넣고, visited 배열을 만들어 방문 여부를 저장합니다.
2. bfs를 이용하여 arr의 값이 '0'인 좌표로만 이동하면서 y 좌표의 값이 M이상인 경우가 있다면 YES를, 그렇지 않다면 NO를 출력합니다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include<iostream> #include<queue> using namespace std; int M, N; char arr[1000][1001]; int visited[1000][1000]; int dy[] = { -1,1,0,0 }; int dx[] = { 0,0,-1,1 }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> M >> N; for (int i = 0; i < M; i++) { cin >> arr[i]; } queue<pair<int, int>> q; for (int i = 0; i < N; i++) { if (arr[0][i] == '0') { q.push({ 0,i }); visited[0][i] = 1; } } while (!q.empty()) { const int y = q.front().first; const int x = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { const int yy = y + dy[i]; const int xx = x + dx[i]; if (yy >= 0 && yy < M && xx >= 0 && xx < N) { if (visited[yy][xx] == 0 && arr[yy][xx] == '0') { visited[yy][xx] = 1; q.push({ yy,xx }); } } else if (yy == M) { cout << "YES"; return 0; } } } cout << "NO"; } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 3197번 - 백조의 호수 (C++) (0) | 2023.09.24 |
---|---|
[ 백준 ] 2015번 - 수들의 합 4 (C++) (0) | 2023.09.23 |
[ 백준 ] 12761번 - 돌다리 (C++) (0) | 2023.09.21 |
[ 백준 ] 12016번 - 라운드 로빈 스케줄러 (C++) (0) | 2023.09.20 |
[ 백준 ] 17609번 - 회문 (C++) (0) | 2023.09.19 |