※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26076번 문제인 곰곰이의 식단 관리 2이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26076
26076번: 곰곰이의 식단 관리 2
$N$행 $M$열 크기의 격자판이 있고, 이 격자판의 $(N,M)$ 위치에는 맛있는 치킨이 놓여 있다. 곰곰이는 $(1,1)$ 에서 출발하여 치킨을 향해 이동하려 한다. 곰곰이는 상하좌우 방향으로 자유롭게 이동
www.acmicpc.net
곰곰이의 출발 위치의 아래와 오른쪽칸에 장애물을 설치하는 등의 방법으로 항상 곰곰이가 치킨을 향해 이동하는 것을 막을 수 있으므로 답은 항상 0, 1 또는 2 셋 중 하나이다.
곰곰이의 출발 위치에서 상하좌우 이동을 이용하여 치킨이 있는 칸까지 이동을 원래 할 수 없다면 0을 출력해주자.
한 칸만 놓아도 충분한 경우, 그 놓아야 할 칸의 인접한 여덟 칸 가운데 "장애물 칸이면서 그 장애물 위에서 여덟방향 이동만으로 윗변또는 오른쪽 변까지 도달할 수 있는 칸"과 "장애물 칸이면서 그 장애물 위에서 여덟방향 이동만으로 아랫변 쪼는 왼쪽 변까지 도달할 수 있는 칸"이 둘 다 존재해야 함을 알 수 있다. 이는 각 변에서부터 장애물 칸을 따라 여덟 방향으로 탐색하는 bfs를 통해 구해낼 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int R, C;
int board[2000][2000];
int dr[8] = { 1, 1, 1, 0, -1, -1, -1, 0 };
int dc[8] = { 1, 0, -1, -1, -1, 0, 1, 1 };
bool visited[2000][2000];
void bfs0() {
visited[0][0] = 1;
queue<pair<int, int>> que;
que.push(make_pair(0, 0));
while (!que.empty()) {
int r = que.front().first, c = que.front().second; que.pop();
for (int i = 1; i < 8; i += 2) {
int rr = r + dr[i], cc = c + dc[i];
if (rr < 0 || rr >= R || cc < 0 || cc >= C || board[rr][cc] || visited[rr][cc]) continue;
visited[rr][cc] = 1;
que.push(make_pair(rr, cc));
}
}
}
bool chk1[2000][2000];
void bfs1() {
queue<pair<int, int>> que;
for (int c = 1; c < C; c++) {
chk1[0][c] = 1;
if (board[0][c]) que.push(make_pair(0, c));
}
for (int r = R - 2; r > 0; r--) {
chk1[r][C - 1] = 1;
if (board[r][C - 1]) que.push(make_pair(r, C - 1));
}
while (!que.empty()) {
int r = que.front().first, c = que.front().second; que.pop();
for (int i = 0; i < 8; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (rr < 0 || rr >= R || cc < 0 || cc >= C || chk1[rr][cc]) continue;
chk1[rr][cc] = 1;
if (board[rr][cc] == 1) que.push(make_pair(rr, cc));
}
}
chk1[0][0] = chk1[R - 1][C - 1] = 0;
}
bool chk2[2000][2000];
void bfs2() {
queue<pair<int, int>> que;
for (int r = 1; r < R; r++) {
chk2[r][0] = 1;
if (board[r][0]) que.push(make_pair(r, 0));
}
for (int c = 1; c < C - 1; c++) {
chk2[R - 1][c] = 1;
if (board[R - 1][c]) que.push(make_pair(R - 1, c));
}
while (!que.empty()) {
int r = que.front().first, c = que.front().second; que.pop();
for (int i = 0; i < 8; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (rr < 0 || rr >= R || cc < 0 || cc >= C || chk2[rr][cc]) continue;
chk2[rr][cc] = 1;
if (board[rr][cc] == 1) que.push(make_pair(rr, cc));
}
}
chk2[0][0] = chk2[R - 1][C - 1] = 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
cin >> board[r][c];
}
}
bfs0();
if (visited[R - 1][C - 1] == 0) {
cout << 0;
return 0;
}
bfs1();
bfs2();
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (chk1[r][c] && chk2[r][c]) {
cout << 1;
return 0;
}
}
}
cout << 2;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 26075 // C++] 곰곰아 선 넘지마 (1) | 2022.12.02 |
---|---|
[BOJ 2171 // C++] 직사각형의 개수 (0) | 2022.12.02 |
[BOJ 26073 // C++] 외로운 곰곰이는 친구가 있어요 (0) | 2022.12.02 |
[BOJ 26071 // C++] 오락실에 간 총총이 (0) | 2022.12.01 |
[BOJ 25813 // C++] Changing Strings (0) | 2022.12.01 |