-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy path#1301 岛屿(dfs hash)AC.cpp
56 lines (52 loc) · 1.13 KB
/
#1301 岛屿(dfs hash)AC.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
#include <stdio.h>
#include <set>
using namespace std;
char s[52][52];
int N, M;
int di[4] = {1, -1, 0, 0};
int dj[4] = {0, 0, 1, -1};
set<int> area, shape;
int dfs(int i, int j, int *mini, int *minj, int *maxi, int *maxj) {
if (i < *mini)
*mini = i;
if (i > *maxi)
*maxi = i;
if (j < *minj)
*minj = j;
if (j > *maxj)
*maxj = j;
s[i][j] = 'x';
int a = 1;
for (int d = 0; d < 4; ++d) {
int ni = i + di[d], nj = j + dj[d];
if (s[ni][nj] == '#')
a += dfs(ni, nj, mini, minj, maxi, maxj);
}
return a;
}
int mhash(int mini, int minj, int maxi, int maxj) {
int k = 79, sh = 0;
for (int i = mini; i <= maxi; ++i) {
for (int j = minj; j <= maxj; ++j) {
sh = sh * k + s[i][j];
}
k*=91;
}
return sh;
}
int main() {
scanf("%d%d", &N, &M);
for (int i = 0; i < N; ++i)
scanf("%s", s[i + 1] + 1);
int n1 = 0;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j)
if (s[i][j] == '#') {
n1++;
int mini = i, maxi = i, minj = j, maxj = j;
area.insert(dfs(i, j, &mini, &minj, &maxi, &maxj));
shape.insert(mhash(mini, minj, maxi, maxj));
}
printf("%d %d %d", n1, area.size(), shape.size());
return 0;
}