SRM477 DIV2 500

这题要转换一下思维来做,从第一行开始,枚举同一行相邻的两个格子,如果不是同一类型 (即不同时为水或者同时为陆地),就判定这条边是合法的。

对于剩余的边,从第二行开始,判断每个格子上方的边是否符合处于两种类型格子之间即可,这样就可以不重复地把全部的边都检查完,由于边缘的边都不算,也让我们很方便的不需要考虑太多的边界条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int beachLength(vector<string> v) {
int n = v.size();
int len[100];
int ret = 0;
for (int i = 0; i < n; i++) {
len[i] = v[i].length();
for (int j = 0; j < len[i]; j++) {
if ((j != 0) && (v[i][j] != v[i][j - 1])) ret++;
if (i == 0) continue;
if (i % 2 == 0) {
if (((j - 1 >= 0) && (j - 1 < len[i - 1])) &&
(v[i][j] != v[i - 1][j - 1]))
ret++;
if (((j >= 0) && (j < len[i - 1])) && (v[i][j] != v[i - 1][j])) ret++;
} else {
if (((j >= 0) && (j < len[i - 1])) && (v[i][j] != v[i - 1][j])) ret++;
if (((j + 1 >= 0) && (j + 1 < len[i - 1])) &&
(v[i][j] != v[i - 1][j + 1]))
ret++;
}
}
}
return ret;
}