其他分享
首页 > 其他分享> > Coast Length——奇奇怪怪的OJ

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