|
思路:
暴力dfs即可 本人不喜欢写循环.......于是写了8个if.......
#include<iostream>
#include<cstdio>
using namespace std;
long long m,n,ans,num,maxn;
char a[3001][3001];//定义char类型数组
void dfs(int x,int y)
{
a[x][y]='0';//搜完后归0
if(x+1<=m&&a[x+1][y]=='1') //边界和判断条件
{
num++;//数量++;
dfs(x+1,y);//继续dfs
}
if(x-1>0&&a[x-1][y]=='1')
{
num++;
dfs(x-1,y);
}
if(x-1>0&&y-1>0&&a[x-1][y-1]=='1')
{
num++;
dfs(x-1,y-1);
}
if(x-1>0&&y+1<=n&&a[x-1][y+1]=='1')
{
num++;
dfs(x-1,y+1);
}
if(y+1<=n&&a[x][y+1]=='1')
{
num++;
dfs(x,y+1);
}
if(x+1<=m&&y+1<=n&&a[x+1][y+1]=='1')
{
num++;
dfs(x+1,y+1);
}
if(y-1>0&&a[x][y-1]=='1')
{
num++;
dfs(x,y-1);
}
if(x+1<=m&&y-1>0&&a[x+1][y-1]=='1')
{
num++;
dfs(x+1,y-1);
}
}
int main()
{
//freopen("fans.in","r",stdin);
//freopen("fans.out","w",stdout);
scanf("%d,%d\n",&m,&n);//输入(由于下面要用getchar所以要读一个\n)
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
a[i][j]=getchar();//由于数据为3000*3000,用cin会超时
getchar();//读一个字符
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]=='1') //如果等于一,搜索开始
{
num=0;//数量每次置0
dfs(i,j);//深搜
maxn=max(maxn,num);//搜一遍找一遍num的最大值
ans++;//搜一次组数+1;
}
}
}
cout<<ans<<","<<maxn+1;
}