fans

【问题描述】

一个球场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;
}

  

原文地址:https://www.cnblogs.com/chen-1/p/9487534.html