先对海拔排序,然后按海拔从高到低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;
}