38ptsWA求助
查看原帖
38ptsWA求助
891606
2023gdgz01楼主2023/10/20 16:41

先对海拔排序,然后按海拔从高到低dfs

#include <cstdio>
#include <algorithm>

using namespace std;

struct node
{
	int x, y, h;
	bool operator< (const node &nod) const
	{
		return h < nod.h;
	}
};

bool vis[705][705];
int n, m, ans, g[705][705], dx[] = {-1, 1, 0, 0, -1, -1, 1, 1}, dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
node pos[490005];

inline bool check(int x, int y)
{
	for (register int i = 0; i < 8; ++i)
	{
		if (g[x][y] < g[x + dx[i]][y + dy[i]])
		{
			return false;
		}
	}
	return true;
}

void dfs(int x, int y)
{
	if (x < 1 || x > n || y < 1 || y > m || vis[x][y])
	{
		return;
	}
	vis[x][y] = true;
	for (register int i = 0; i < 8; ++i)
	{
		if (g[x + dx[i]][y + dy[i]] <= g[x][y])
		{
			dfs(x + dx[i], y + dy[i]);
		}
	}
}

int main()
{
	scanf("%d%d", &n, &m);
	for (register int i = 1; i <= n; ++i)
	{
		for (register int j = 1; j <= m; ++j)
		{
			scanf("%d", &g[i][j]);
			pos[(i - 1) * n + j] = {i, j, g[i][j]};
		}
	}
	sort(pos + 1, pos + n * m + 1);
	for (register int i = n * m; i; --i)
	{
		if (!vis[pos[i].x][pos[i].y] && check(pos[i].x, pos[i].y))
		{
			dfs(pos[i].x, pos[i].y);
			++ans;
		}
	}
	printf("%d", ans);
	return 0;
}
2023/10/20 16:41
加载中...