二刷提高课,题解目录在这里— 提高课的题解目录
与上一题一样,只需要判断一下是否有比此点大的或者小的即可
#include<iostream>
using namespace std;
const int N=1e3+10,M=N*N;
typedef pair<int ,int >PII;
int g[N][N];
bool st[N][N];
PII q[M];
int n;
int di,fd;
void bfs(int x,int y,bool &hdi,bool &hfd)
{
int hh=0,tt=0;
q[0]={x,y};
st[x][y]=true;
while(hh<=tt)
{
auto kk=q[hh++];
int aa=kk.first,bb=kk.second;
for(int i=-1;i<=1;i++)
{
for(int j=-1;j<=1;j++)
{
int x1=aa+i,y1=bb+j;
if(x1==aa&&y1==bb)continue;
if(x1<1||x1>n||y1<1||y1>n)continue;
if(g[x1][y1]>g[aa][bb])
{
hfd=true;
continue;
}
else if(g[x1][y1]<g[aa][bb])
{
hdi=true;
continue;
}
else
{
if(!st[x1][y1])
{
st[x1][y1]=true;
q[++tt]={x1,y1};
}
}
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)cin>>g[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(!st[i][j])
{
bool hdi=false,hfd=false;
bfs(i,j,hdi,hfd);
if(!hdi)di++;
if(!hfd)fd++;
}
}
cout<<fd<<" "<<di;
return 0;
}