Skip to content

Commit 512773a

Browse files
committed
[Gold II] Title: 불켜기, Time: 24 ms, Memory: 2764 KB -BaekjoonHub
1 parent eef0e57 commit 512773a

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [Gold II] 불켜기 - 11967
2+
3+
[문제 링크](https://www.acmicpc.net/problem/11967)
4+
5+
### 성능 요약
6+
7+
메모리: 2764 KB, 시간: 24 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 너비 우선 탐색
12+
13+
### 제출 일자
14+
15+
2025년 11월 24일 19:14:05
16+
17+
### 문제 설명
18+
19+
<p>농부 존은 최근에 N × N개의 방이 있는 거대한 헛간을 새로 지었다. 각 방은 (1, 1)부터 (N,N)까지 번호가 매겨져있다(2 ≤ N ≤ 100). 어둠을 무서워하는 암소 베시는 최대한 많은 방에 불을 밝히고 싶어한다.</p>
20+
21+
<p>베시는 유일하게 불이 켜져있는 방인 (1, 1)방에서 출발한다. 어떤 방에는 다른 방의 불을 끄고 켤 수 있는 스위치가 달려있다. 예를 들어, (1, 1)방에 있는 스위치로 (1, 2)방의 불을 끄고 켤 수 있다. 베시는 불이 켜져있는 방으로만 들어갈 수 있고, 각 방에서는 상하좌우에 인접한 방으로 움직일 수 있다. </p>
22+
23+
<p>베시가 불을 켤 수 있는 방의 최대 개수를 구하시오.</p>
24+
25+
### 입력
26+
27+
<p>첫 번째 줄에는 N(2 ≤ N ≤ 100)과, M(1 ≤ M ≤ 20,000)이 정수로 주어진다.</p>
28+
29+
<p>다음 M줄에는 네 개의 정수 x, y, a, b가 주어진다. (x, y)방에서 (a, b)방의 불을 켜고 끌 수 있다는 의미이다. 한 방에 여러개의 스위치가 있을 수 있고, 하나의 불을 조절하는 스위치 역시 여러개 있을 수 있다. </p>
30+
31+
### 출력
32+
33+
<p>베시가 불을 켤 수 있는 방의 최대 개수를 출력하시오.</p>
34+
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include <iostream>
2+
#include <map>
3+
#include <queue>
4+
#define MAX 105
5+
using namespace std;
6+
7+
int N, M;
8+
int rooms[MAX][MAX];
9+
vector<pair<int, int>> adj[MAX][MAX];
10+
int visited[MAX][MAX];
11+
int dx[4] = {0, 0, 1, -1};
12+
int dy[4] = {1, -1, 0, 0};
13+
int answer;
14+
15+
void input() {
16+
cin >> N >> M;
17+
for (int j = 0; j < M; j++) {
18+
int x_1, y_1, x_2, y_2;
19+
cin >> x_1 >> y_1 >> x_2 >> y_2;
20+
adj[x_1][y_1].push_back({x_2, y_2});
21+
}
22+
}
23+
24+
int bfs() {
25+
queue<tuple<int, int>> q; // x, y
26+
q.push({1, 1});
27+
visited[1][1] = 2;
28+
29+
int cnt = 1;
30+
while (!q.empty()) {
31+
int cx = get<0>(q.front());
32+
int cy = get<1>(q.front());
33+
q.pop();
34+
35+
// cout << "cx: " << cx << ", " << "cy: " << cy << "\n";
36+
37+
// 불 킬 수 있는 곳 다 켜기
38+
for (auto p : adj[cx][cy]) {
39+
int nx = p.first, ny = p.second;
40+
// 1이거나 2는 다 continue
41+
if (visited[nx][ny]) continue;
42+
43+
// 불 켰다고 알려주기 + cnt 증가
44+
visited[nx][ny] = 1;
45+
cnt++;
46+
47+
// 불을 킨 곳 주변 탐색
48+
for (int i = 0; i < 4; i++) {
49+
int nnx = nx + dx[i];
50+
int nny = ny + dy[i];
51+
// 주변에 불 킨 곳이 있네? 거기부터 다시 탐색 고고
52+
if (visited[nnx][nny] == 2) {
53+
q.push({nnx, nny});
54+
break; // 여기서 왜 break?
55+
}
56+
}
57+
}
58+
59+
// 주변에 불 켜진 곳이 있으면, 탐색 고고
60+
for (int i = 0; i < 4; i++) {
61+
int nx = cx + dx[i];
62+
int ny = cy + dy[i];
63+
if (visited[nx][ny] == 1) {
64+
visited[nx][ny] = 2;
65+
q.push({nx, ny});
66+
}
67+
}
68+
}
69+
70+
return cnt;
71+
}
72+
73+
int main() {
74+
input();
75+
76+
answer = bfs();
77+
cout << answer << "\n";
78+
79+
return 0;
80+
}

0 commit comments

Comments
 (0)