fans

 
   试题编号:0610 收 藏   
D模拟101-1::球迷
难度级别:A; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B
试题描述

一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。

球迷选座特性:同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);

给定一个M*N的二维球场,0代表该位置没人,1代表该位置有人,希望输出球队群体个数P,最大的球队群体人数Q。

输入
第一行,2个数字,M、N,使用英文逗号隔开。
接下来M行,每行N个数字,使用英文逗号隔开。
输出
一行,2数字,P和Q。
输入示例
10,10
0,0,0,0,0,0,0,0,0,0
0,0,0,1,1,0,1,0,0,0
0,1,0,0,0,0,0,1,0,1
1,0,0,0,0,0,0,0,1,1
0,0,0,1,1,1,0,0,0,1
0,0,0,0,0,0,1,0,1,1
0,1,1,0,0,0,0,0,0,0
0,0,0,1,0,1,0,0,0,0
0,0,1,0,0,1,0,0,0,0
0,1,0,0,0,0,0,0,0,0
输出示例
6,8
其他说明
对于100%的数据,1<=M,N<=3e3。

 

                这道题是本蒟蒻昨天考试的一道题,拿了满分(开心)。

                这道题是一道搜索,深搜和广搜都可以。我写的是深搜,不用回溯。然后上参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,ans,sum,maxn;
 4 char a[3005][3005];
 5 bool f[3005][3005];
 6 void dfs(int x,int y)
 7 {
 8     if(x<1||x>m||y<1||y>n||f[x][y]==true||a[x][y]=='0') return;//返回条件 
 9     sum++;//记录最大球迷群体 
10     f[x][y]=true;//标记 
11     dfs(x-1,y-1);//向八个方向搜索 
12     dfs(x-1,y);
13     dfs(x-1,y+1);
14     dfs(x,y-1);
15     dfs(x,y+1);
16     dfs(x+1,y-1);
17     dfs(x+1,y);
18     dfs(x+1,y+1);
19 }
20 int main()
21 {
22     //freopen("fans.in","r",stdin);
23     //freopen("fans.out","w",stdout);
24     scanf("%d,%d\n",&m,&n);//输入长和宽 
25     for(int i=1;i<=m;i++)
26     {
27         for(int j=1;j<=n;j++) 
28         {
29             char ch;
30             a[i][j]=getchar();//用getchar读入,先读入数,再读入逗号和换行 
31             ch=getchar();
32         }
33     }
34     for(int i=1;i<=m;i++)
35     {
36         for(int j=1;j<=n;j++)
37         {
38             if(a[i][j]=='1'&&f[i][j]==false)//如果是球迷并且没搜过就搜索        
39             {
40                 ans++;//统计有几个球迷群体 
41                 dfs(i,j);//搜索 
42                 maxn=max(maxn,sum);//统计最大球迷群体 
43                 sum=0;//把计数的变量赋成零 
44             }
45         }
46     }
47     printf("%d,%d",ans,maxn);//输出有几个球迷群体和最大球迷群体 
48     return 0;//完美结束 
49 }

 

posted @ 2018-08-17 10:16  zgym  阅读(251)  评论(0编辑  收藏  举报