-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1012.cpp
68 lines (56 loc) · 1.85 KB
/
1012.cpp
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
60
61
62
63
64
65
66
67
68
// 유기농 배추
#include <iostream>
#include <cstdio>
#include <stack>
#define MAX 50
int countWorms(int farm[][MAX], int M, int N);
int main(void)
{
int T, M, N, K, X, Y;
scanf("%d", &T);
int *outputs = (int *)malloc(sizeof(int) * T);
for (int t=0; t<T; t++) {
int farm[MAX][MAX] = {0};
scanf("%d %d %d", &M, &N, &K);
for (int k=0; k<K; k++) {
scanf("%d %d", &X, &Y);
farm[X][Y] = 1; // rows -> X & columns -> Y
}
outputs[t] = countWorms(farm, M, N);
}
for (int t=0; t<T; t++)
printf("%d\n", outputs[t]);
return 0;
}
int countWorms(int farm[][MAX], int M, int N)
{
int worm = 0;
int visited[MAX][MAX];
std::stack<int> st;
std::fill(&visited[0][0], &visited[0][0] + sizeof(visited) / sizeof(int), 0);
for (int i=0; i<M; i++) {
for (int j=0; j<N; j++) {
if (farm[i][j] == 1 && visited[i][j] == 0) {
visited[i][j] = 1;
worm++;
st.push(M * j + i); // (i, j) -> M * j + i
while (!st.empty())
{
int x = st.top() % M; // i -> x
int y = st.top() / M; // j -> y
visited[x][y] = 1;
st.pop();
if (x + 1 < M && farm[x+1][y] == 1 && visited[x+1][y] == 0)
st.push(M * y + x + 1);
if (y + 1 < N && farm[x][y+1] == 1 && visited[x][y+1] == 0)
st.push(M * (y+1) + x);
if (0 <= x - 1 && farm[x-1][y] == 1 && visited[x-1][y] == 0)
st.push(M * y + x - 1);
if (0 <= y - 1 && farm[x][y-1] == 1 && visited[x][y-1] == 0)
st.push(M * (y-1) + x);
}
}
}
}
return worm;
}