題目描述
Jimmy 和 Symbol 約好一起看星星,浩瀚的星空可視爲一個長爲 N、寬爲 M 的矩陣,矩陣中共有 N×M 個位置,一個位置可以用座標 (i,j)(1≤i≤N,1≤j≤M)來表示。每個位置上可能是空的,也可能有一個星星。
對於一個位置 (i,j),與其相鄰的位置有左邊、左上、上面、右上、右邊、右下、下面、左下 8 個位置。相鄰位置上的星星被視爲同一個星座,這種關係有傳遞性,例如若 (1,1),(1,2),(1,3)三個位置上都有星星,那麼這三個星星視爲同一個星座。包含的星星數量相同的星座被視爲一個星系(一個星系中的星座不一定相鄰),星系的大小爲星系中包含的所有星星數量。
由於 Symbol 太喜歡星系了,他就想考一考 Jimmy,讓 Jimmy 求出星空中有多少個星系,他還想知道,最大的星系有多大。
輸入
第一行兩個整數 N,M 表示矩陣的長寬。
接下來 N行每行 M個字符,每個字符只可能是’.‘或’’(不含引號,下同)。這 N行中第 i行的第j個字符是’'表示位置 (i,j)上有一個星星,否則表示它是空的。
輸出
僅一行兩個整數,用空格分隔開,分別表示星系的數量與最大星系的大小。
樣例輸入
輸入樣例1
5 7
*......
..**..*
.*...*.
...*...
....*..
輸入樣例2
10 10
**..**.**.
***....*..
*...**.**.
...*..*...
..........
**...**.*.
..*.*....*
..........
***..*.*..
.***..*...
樣例輸出
輸出樣例1
3 4
輸出樣例2
4 12
數據範圍限制
對於 20%的數據,N,M≤20,最大星系大小不超過 200。
對於 50%的數據,N,M≤400。
對於 70%的數據,N,M≤1100。
對於100%的數據,2≤N,M≤1500,最大星系大小不超過 100000。
分析:
深搜即可 讀懂題目就很好做了
共8種方向 標記 最大值
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
ll n,m;
char c[2010][2010];
bool a[2010][2010];
ll sum[1000010],k,maxx,ans,maxn,t;
ll dx[8]={0,1,0,-1,1,1,-1,-1};
ll dy[8]={1,0,-1,0,1,-1,1,-1};
void dfs(ll u,ll v) //深搜
{
t++;
a[u][v]=1;
for(int i=0;i<=7;i++)
{
ll x=u+dx[i],y=v+dy[i];
if(x<=0||x>n||y<=0||y>m)
continue;
if(c[x][y]=='*'&&!a[x][y])
dfs(x,y);
}
}
int main(){
freopen("star.in","r",stdin);
freopen("star.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>c[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(c[i][j]=='*'&&!a[i][j]) //合法
{
t=0;
dfs(i,j);
sum[t]++;
maxx=max(maxx,t);
k++;
}
for(int i=1;i<=maxx;i++)
if(sum[i])
{
ans++;
maxn=max(maxn,sum[i]*i); //最大值
}
cout<<ans<<" "<<maxn;
return 0;
}