【问题描述】
一个球场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; }