其實本題是增強版,原數據是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 }