-
[13565] 침투BOJ 2021. 11. 18. 20:46
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
<문제>
0행중 '0'인것을 큐에 전부 넣고, bfs를 돌린 뒤 n-1행중 방문한 정점이 있는지를 체크하면 된다.
0행이 비어있다면 어떻게든 전류가 바깥쪽에서 공급될 수 있고
n-1행이 비어있다면 어떻게든 전류가 안쪽까지 도달할 수 있다.
bfs의 시작조건, 전류의 전달되는 부분에대한 모델링만 잘 이루어지면 간단한 bfs문제로 바꿔풀 수 있다.
<소스코드>
123456789101112131415161718192021222324252627282930313233343536#include <bits/stdc++.h>using namespace std;int n, m, dy[4] = {0, 1, 0, -1}, dx[4] = {1, 0, -1, 0};char a[1005][1005];bool visited[1005][1005];int main(void) {cin >> n >> m;int i, j;for (i = 0; i < n; i++)for (j = 0; j < m; j++) cin >> a[i][j];queue<pair<int, int>> q;for (j = 0; j < m; j++) {if (a[0][j] == '0') {q.push({0, j});visited[0][j] = true;}}while (!q.empty()) {auto cur = q.front();q.pop();for (i = 0; i < 4; i++) {int y = cur.first + dy[i];int x = cur.second + dx[i];if (y < 0 || x < 0 || y >= n || x >= m) continue;if (a[y][x] == '0' && visited[y][x] == false) {visited[y][x] = true;q.push({y, x});}}}bool flag = false;for (j = 0; j < m; j++)if (visited[n - 1][j]) flag = true;cout << (flag ? "YES" : "NO");return 0;}cs 'BOJ' 카테고리의 다른 글
[14465] 소가 길을 건너간 이유 5 (0) 2021.11.18 [13977] 이항 계수와 쿼리 (0) 2021.11.18 [2424] 부산의 해적 (0) 2021.11.17 [2138] 전구와 스위치 (0) 2021.11.16 [3190] 뱀 (0) 2021.11.13