【问题描述】
一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。
球迷选座特性:同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);
给定一个M*N的二位球场,0代表该位置没人,1代表该位置有人,希望输出球队群体个数P,最大的球队群体人数Q。
【输入】
第一行,2个数字,M、N,使用英文逗号隔开。
接下来M行,每行N个数字,使用英文逗号隔开。
【输出】
一行,2数字,P和Q。
题解:见代码注释
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int a[3005][3005];
int cnt;
int max_s;
int ans;
int n,m;
int next_x[9]={1,1,1,0,0,0,-1,-1,-1};
int next_y[9]={0,-1,1,0,-1,1,1,-1,0};
void dfs(int x,int y)
{
if(x<1 || x>n || y<1 || y>m || a[x][y]==0) return;//不符合要求的dfs直接return
ans++;
a[x][y]=0;
dfs(x,y+1);
dfs(x,y-1);
dfs(x+1,y);
dfs(x+1,y+1);
dfs(x+1,y-1);
dfs(x-1,y+1);
dfs(x-1,y-1);
dfs(x-1,y);
//继续dfs
}
int main()
{
//freopen("fans.in","r",stdin);
//freopen("fans.out","w",stdout);
scanf("%d,%d",&n,&m);
char feiwu;//废物的拼音,只用来占空格位的char我都用feiwu
for(int i=1;i<=n;i++)
{
feiwu=getchar();
for(int j=1;j<=2*m-1;j++)
{
char p=getchar();//getchar较cin和scanf更快,否则会超时
if(p=='0')//将字符变数字
{
a[(i+1/2)][(j+1)/2]=0;
}
else if(p=='1')//将字符变数字
{
a[(i+1/2)][(j+1)/2]=1;
}
else continue;//没用
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j])
{
ans=0;
cnt++;//区域数
dfs(i,j);
max_s=max(max_s,ans);//算最大的区域
}
}
}
cout<<cnt<<","<<max_s<<endl;//输出
return 0;
}