TooY0ung 所在的城市可以看做一个 N∗M 的地图,在这个城市中每个格点都是一个建筑, 每个建筑有它自己的美丽值,城市的外围都是空地,我们认为空地的美丽值为 0若一个建筑的上下左右四个建筑中有和它美丽值相同的建筑,则认为这两个建筑同属于一个公司(一个公司可以只有一个建筑)。 TooY0ung 作为这个城市的城市规划研究员,他有一个看法: 1.如果有一个公司的美丽值比它周围其他所有的建筑的美丽值都低,那就认为这个公司是不美丽的。 2.如果有一个公司的美丽值比它周围其他所有的建筑的美丽值都高,那就认为这个公司是美丽的。 3.若不满足以上情况的公司则认为是一个颜值一般的公司
现在 TooY0ung 拿到了城市的地图,他想要知道这个城市中有多少个不美丽公司和多少个美丽公司。
输入格式 输入文件名为:city.in
输入第一行包含两个自然数 N 和 M,表示有一个 N∗M 的地图 接下来N行每行包含 M 个数字,每个数字表示一个建筑的美丽值 b[i][j]
输出格式 输出文件名为:city.out
输出一行包含两个整数,分别表示不美丽公司的数量和美丽公司的数量
#include<bits/stdc++.h>
using namespace std;
struct xy
{
int x;
int y;
int sum;
};
vector<xy> q;
long long a[1005][1005];
long long minn,maxx;
bool vis[1005][1005],vis2[1005][1005];
int ans1,ans2;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,m;
void read()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
}
void dfs(int x,int y,int s,int w)
{
if(x<1 || x>n || y<1 || y>m || a[x][y]!=s || vis[x][y]==1)
{
return;
}
a[x][y]=w;
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=1 && xx<=n && yy>=1 && yy<=m && a[xx][yy]!=-1 && a[xx][yy]!=s && vis2[xx][yy]==0)
{
maxx=max(maxx,a[xx][yy]);
minn=min(minn,a[xx][yy]);
}
dfs(xx,yy,s,w);
}
}
int main()
{
freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
read();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(vis[i][j]==1)
{
continue;
}
maxx=-1;
minn=1e9;
int s=a[i][j];
dfs(i,j,s,-1);
// for(int u=1;u<=n;u++)
// {
// for(int v=1;v<=m;v++)
// {
// cout<<a[u][v]<<' ';
// }
// cout<<"\n";
// }
// cout<<"\n";
// cout<<"max="<<maxx<<' '<<"min="<<minn<<"\n";
if(maxx<s)
{
ans2++;
}
if(minn>s)
{
ans1++;
}
//memset(vis,0,sizeof(vis));
for(int u=1;u<=n;u++)
{
for(int v=1;v<=m;v++)
{
if(a[u][v]==-1)
{
a[u][v]=s;
}
}
}
}
}
cout<<ans1<<' '<<ans2;
return 0;
}
/*3 4
1 3 2 6
1 2 2 7
3 2 2 5*/
我的代码可以得到80分,TLE求优化