DFS 를 활용하는 가장 간당한 문제이다.
DFS 는 보통 재귀함수를 사용하여 사용하는데.
재귀함수로 여러번 호출해서 사용하게되면 프로그램 속도가 늦쳐질 수 있기 때문에,
STL 에서 stack 을이용해 구현해보았다.
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
57
58
59
| #include<iostream>#include<stack>#include<vector>#include<memory.h>using namespace std;stack<pair<int, int>> S;vector<vector<bool>> V;void CHECK(int x, int y){ if (x > 0 && V[x - 1][y] == true){ S.push(pair<int,int>(x - 1, y)); V[x - 1][y] = false; } if (x+1 <50 && V[x+1][y] == true){ S.push(pair<int, int>(x + 1, y)); V[x + 1][y] = false; } if (y > 0 && V[x][y-1] == true){ S.push(pair<int, int>(x , y-1)); V[x][y-1] = false; } if (y+1<50 && V[x][y+1] == true){ S.push(pair<int, int>(x, y+1)); V[x][y+1] = false; }}int main(){ int T, M, N, K; int cnt; cin >> T; while (T--){ V.clear(); cin >> M >> N >> K; V.assign(M+1, vector<bool>(N+1, false)); cnt = 0; while (K--){ int x, y; cin >> x >> y; V[x][y] = true; } for (int i = 0; i < M; i++){ for (int j = 0; j < N; j++){ if (V[i][j] == true){ cnt++; CHECK(i,j); V[i][j] = false; while (!S.empty()){ pair<int, int> temp = S.top(); S.pop(); CHECK(temp.first, temp.second); } } } } cout <<cnt<<endl; } return 0;} |
0 개의 댓글:
댓글 쓰기