※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 28291번 문제인 레드스톤이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/28291
28291번: 레드스톤
모든 레드스톤 램프가 켜지는 순간이 존재하면 "success", 모든 레드스톤 램프가 켜지는 순간이 존재하지 않는다면 "failed"를 출력한다.
www.acmicpc.net
50x50 배열을 이용해 주어진 레드스톤 회로 블록 배치들을 표현한 뒤, 해당 배열 위에서 회로를 따라 모든 레드스톤 블록으로부터 레드스톤 램프까지 거리 15 이내로 도달할 수 있는지를 판단해 문제를 해결하자. 이는 BFS 등을 이용해 구현할 수 있다.
각 레드스톤 램프는 전기신호를 다시 전달하지 않음에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int R, C, N;
int board[52][52];
int dist[52][52];
queue<pair<int, int>> que;
int cnt;
int dr[4] = { 1,0,-1,0 };
int dc[4] = { 0,1,0,-1 };
void bfs() {
while (!que.empty()) {
int r = que.front().first, c = que.front().second; que.pop();
for (int i = 0; i < 4; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (dist[rr][cc]) continue;
dist[rr][cc] = dist[r][c] - 1;
if (!dist[rr][cc]) continue;
if (board[rr][cc] == 1) que.push(make_pair(rr, cc));
else if (board[rr][cc] == 2) board[rr][cc] = 0, cnt--;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> C >> R >> N;
while (N--) {
string s; int r, c;
cin >> s >> c >> r;
r++, c++;
if (s[9] == 'b') dist[r][c] = 16, que.push(make_pair(r, c));
else if (s[9] == 'd') board[r][c] = 1;
else board[r][c] = 2, cnt++;
}
bfs();
if (cnt) cout << "failed";
else cout << "success";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 28294 // C++] 프랙탈 (0) | 2023.11.07 |
---|---|
[BOJ 28293 // C++] 자릿수 (0) | 2023.11.06 |
[BOJ 28292 // C++] 개미 수열 (0) | 2023.11.04 |
[BOJ 28290 // C++] 안밖? 밖안? 계단? 역계단? (0) | 2023.11.03 |
[BOJ 28289 // C++] 과 조사하기 (1) | 2023.11.02 |