18年今日頭條筆試第一題題解:球迷(fans)

其實本題是增強版,原數據是100*100的,老師爲了尊重咱們的智商加成了3000*3000並進行了字符串處理……ios

上原題~spa


球迷

【問題描述】code

一個球場C的球迷看臺可容納M*N個球迷。官方想統計一共有多少球迷羣體,最大的球迷羣體有多少人。blog

球迷選座特性:同球迷羣體會選擇相鄰座位,不一樣球迷羣體選擇不相鄰的座位。(相鄰包括先後相鄰、左右相鄰、斜對角相鄰);ci

給定一個M*N的二位球場,0表明該位置沒人,1表明該位置有人,但願輸出球隊羣體個數P,最大的球隊羣體人數Q。字符串

【輸入】字符串處理

第一行,2個數字,M、N,使用英文逗號隔開。string

接下來M行,每行N個數字,使用英文逗號隔開。io

【輸出】table

一行,2數字,P和Q。

【輸入輸出樣例】

fans.in

fans.out

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<=3×103

 


 

 

思路:特殊特判讀入,找到有人就進行八連塊搜索。

上代碼~

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 using namespace std;
 6 int m=0,n=0,t=0,num,maxnum=0;
 7 bool fans[3010][3010];
 8 char x[10010];
 9 void reads()//字符串特判讀入 
10 {
11     scanf("%s",&x);
12     int l=strlen(x);
13     int i=0;
14     while(x[i]!=',')
15         {m=m*10+x[i]-48;i++;}//字符轉數字 
16     i++;
17     while(i<l)
18         {n=n*10+x[i]-48;i++;}
19     return;
20 }
21 void readings()
22 {
23     int l=n*2-1;//加上逗號的長度 
24     for(int i=1;i<=m;i++)
25     {
26         scanf("%s",x);
27         for(int j=0;j<l;j=j+2)
28             fans[i][j/2+1]=x[j]-48;//因爲是單個字符就不用累加了 
29     }
30     return;
31 }
32 void dfs(int a,int b)//搜索 
33 {
34     if(a<1||a>m||b<1||b>n) return;//越界判斷 
35     if(!fans[a][b]) return;//是否坐了人 
36     fans[a][b]=0;//該人已經計數並撤去標記以避免重複標記 
37     num++;
38     dfs(a-1,b-1);//向八連塊方向搜索坐在一塊兒的球迷 
39     dfs(a-1,b);
40     dfs(a-1,b+1);
41     dfs(a,b-1);
42     dfs(a,b);
43     dfs(a,b+1);
44     dfs(a+1,b-1);
45     dfs(a+1,b);
46     dfs(a+1,b+1);
47     return;//記得搜索完後退出去 
48 }
49 int main()
50 {
51     reads();//特殊讀入m和n 
52     readings();//讀入球迷就座狀況 
53     for(int i=1;i<=m;i++)
54     {
55         for(int j=1;j<=n;j++)
56         {
57             if(fans[i][j])
58             {
59                 t++;//發現一個單獨的團體組織 
60                 num=0;//單個團體計數 
61                 dfs(i,j);
62                 if(num>maxnum) maxnum=num;//更新最大值 
63             }
64         }
65     }
66     printf("%d,%d",t,maxnum);//按要求輸出 
67     return 0;
68 }
相關文章
相關標籤/搜索