Problem Description
小晴天老师正在备课,这时,可恶的墨水瓶突然自己打翻了!悲剧发生了!小晴天的备课稿都被墨水弄脏了。。。。
不过小晴天很乐观~这时他把他的一张纸分成n*m个格子,其中有一些格子被墨水涂黑了,有的没有。那么小晴天想知道,最大的一块联通的墨水块占多少个格子呢?
所谓的联通的即两个格子至少有一个公共顶点。
Input
多组数据,首先是一个正整数t(t<=20)
对于每组数据,先给出两个整数m.n(1<=n,m<=20)
然后是一个m行n列的01矩阵,若为1,则该格子被墨水染黑。
Output
对于每组数据,输出一个整数,表示最大被墨水染黑的连通格子数。
Sample Input
1 4 4 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0
Sample Output
5
题意:
输入N,M,然后再输入N*M大小的地图,问你有1相临的最大个数。
很基础的一道深度搜索的题目,坑爹的是,= -,没认真看题,是八个方向。
1 #include <algorithm> 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 using namespace std; 6 int Map[25][25]; 7 int Len_X,Len_Y; 8 int SUM;/*记录1相临的最大个数*/ 9 int sum;/*记录每一次进入的1相邻的个数*/ 10 void Input() 11 { 12 int i,j; 13 for(i=0;i<=Len_X+1;i++) 14 { 15 for(j=0;j<=Len_Y+1;j++) 16 { 17 if(i==0||j==0||i==Len_X+1||j==Len_Y+1)Map[i][j]=0; 18 else scanf("%d",&Map[i][j]); 19 } 20 } 21 } 22 23 void BFS(int x,int y) 24 { 25 if(Map[x][y]==1) 26 { 27 Map[x][y]=0; /*把当前可行的位置标记成‘*‘*/ 28 sum++; /*每次遇到一个1,sum++ */ 29 BFS(x+1,y); /*进入八个方向进行查找*/ 30 BFS(x-1,y); 31 BFS(x,y+1); 32 BFS(x,y-1); 33 BFS(x+1,y+1); 34 BFS(x-1,y-1); 35 BFS(x-1,y+1); 36 BFS(x+1,y-1); 37 } 38 return ; 39 } 40 int main() 41 { 42 int i,j,T; 43 scanf("%d",&T); 44 while(T--) 45 { 46 scanf("%d%d",&Len_X,&Len_Y); 47 Input();/*输入地图,创建围墙*/ 48 SUM=0; 49 for(i=1;i<=Len_X;i++) 50 { 51 for(j=1;j<=Len_Y;j++) 52 { 53 if(Map[i][j]==1)/*判断当前点为1,则进入搜索*/ 54 { 55 sum=0; /*设置当前1的个数为0*/ 56 BFS(i,j); 57 if(SUM<=sum) /*获取最大值*/ 58 SUM=sum; 59 } 60 } 61 } 62 printf("%d\n",SUM); 63 } 64 return 0; 65 }