Coast Length——奇奇怪怪的OJ
作者:互联网
Hi,我是OIer一枚。
我太弱了
题目链接:
题面
问海岸的长度和。
其中,岛中湖,岛中湖中岛……不算。
思路
我们在整个图外面加一圈 $ 0 $,这样我们就能轻松处理岛了。
从最外圈遍历 $ 0 $ ,遍历到的都是海。
然后,对于每块海,看它周围有几个陆地。
每一个陆地就 $ + 1 $,加一条边界嘛。
代码
#include <bits/stdc++.h>
using namespace std;
int read() {
int f = 0, w = 1; char ch = getchar();
while ('0' > ch || ch > '9') if (ch == '-') w = -1, ch = getchar();
while ('0' <= ch && ch <= '9') f = f * 10 + (ch - '0'), ch = getchar();
return f * w;
}
void write(int x) {
if (x < 0) putchar('-'), x = -x;
char stk[35]; int cnt = 0;
do {
stk[cnt++] = x % 10 + '0', x /= 10;
} while (x);
for (int i = cnt - 1; i >= 0; i--) putchar(stk[i]);
putchar(' ');
}
bool mp[1005][1005];
bool vis[1005][1005];
int n, m;
void dfs(int i, int j) {
if (0 <= i && i <= n + 1 && 0 <= j && j <= m + 1 && !mp[i][j] && !vis[i][j]) {
vis[i][j] = 1;
dfs(i + 1, j);
dfs(i - 1, j);
dfs(i, j + 1);
dfs(i, j - 1);
}
}
int main() {
n = read(), m = read();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (getchar() == '1') {
mp[i][j] = 1;
}
}
getchar();
}
dfs(0, 0);
int ans = 0;
for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= m + 1; j++) {
if (vis[i][j]) {
ans += (i == 0) ? (0) : (mp[i - 1][j]);
ans += (i == n + 1) ? (0) : (mp[i + 1][j]);
ans += (j == 0) ? (0) : (mp[i][j - 1]);
ans += (j == m + 1) ? (0) : (mp[i][j + 1]);
}
}
}
write(ans);
return 0;
}
标签:ch,OJ,int,while,Coast,Length,bool,1005,getchar 来源: https://www.cnblogs.com/AProblemSolver/p/16593142.html