感谢大佬
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;
const int dx[8]={-1,1,0,0,-1,1,-1,1};
const int dy[8]={0,0,-1,1,-1,-1,1,1};
int n;
ll high[1010][1010];
int nz[100000010][2];
bool be[1010][1010];
bool v[1010][1010];
ll ans_f,ans_g;
struct node{
int x,y;
}_find;
queue<node> q;
node pu(int _x,int _y){
node a;
a.x=_x;
a.y=_y;
return a;
}
void bfs(int sx,int sy,int _or){
while(!q.empty())
q.pop();
int s=0;
q.push(pu(sx,sy));
nz[++s][0]=sx,nz[s][1]=sy;
while(!q.empty())
{
_find=q.front();
q.pop();
for(int i=0;i<8;i++)
{
int nx=_find.x+dx[i];
int ny=_find.y+dy[i];
if(nx<=0||nx>n||ny<=0||ny>n)
continue;
if((high[nx][ny]>high[_find.x][_find.y]&&_or==1)||(high[nx][ny]<high[_find.x][_find.y]&&_or==0))
return ;
if((high[nx][ny]==high[_find.x][_find.y])&&!v[nx][ny])
{
nz[++s][0]=nx,nz[s][1]=ny;
v[nx][ny]=true;
q.push(pu(nx,ny));
}
}
}
for(int i=1;i<=s;i++)
be[nz[i][0]][nz[i][1]]=true;
if(_or==1)
ans_f++;
else
ans_g++;
}
int main(){
bool flag=true;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&high[i][j]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(be[i][j])
continue;
bfs(i,j,1);
}
}
memset(v,false,sizeof(v));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(be[i][j])
continue;
bfs(i,j,0);
flag=false;
}
}
if(flag)
printf("1 1");
else
printf("%lld %lld",ans_f,ans_g);
return 0;
}