[NOI Online入門組]#3 觀星

題目描述

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章