RT,实在想不出优化了
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
};
int dx[10]={0,0,1,1,-1,-1,1,-1};
int dy[10]={1,-1,1,-1,1,-1,0,0};
int mp[1010][1010];
bool ms[1010][1010];
queue<node> q;
int n;
int hyp=0,low=0;
void bfs(int x,int y)
{
while(!q.empty()) q.pop();
q.push({x,y});
ms[x][y]=1;
int h=1,l=1;
while(!q.empty())
{
node w=q.front();
q.pop();
ms[w.x][w.y]=1;
for(int i=0;i<8;i++)
{
int xx=w.x+dx[i],yy=w.y+dy[i];
if(xx>0&&xx<=n&&yy>0&&yy<=n)
{
if(mp[xx][yy]<mp[w.x][w.y])
{
l=0;
}
if(mp[xx][yy]>mp[w.x][w.y])
{
h=0;
}
if(mp[xx][yy]==mp[w.x][w.y]&&!ms[xx][yy])
{
q.push({xx,yy});
}
}
}
}
hyp+=h,low+=l;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!ms[i][j])
{
bfs(i,j);
}
}
}
cout<<hyp<<' '<<low;
return 0;
}