描述
有一块矩形的海域,其中有陆地也有海洋,这块海域是CSUFT_ACM集训队的训练基地,这一天,昌神说要集训队的队员不能总是训练,于是昌神提出了中南林ACM集训队第一场环陆马拉松比赛,顾名思义就是围绕着陆地的边缘跑步。现在昌神给你出了个问题:这个比赛最多需要跑多少距离。
注意,这块海域上可能有多块陆地,比赛的场地可能设在任何一块陆地上。
输入
多组输入,每组输入第一行给出两个数字R,C(1 ≤ R, C ≤ 50)。表示这组输入的01矩阵的行数和列数,接下来R行每行输入C个数字(0表示海水,1表示陆地),上下左右相连的陆地算作一块整的陆地。每个0或者1表示一个边长为1正方形。输入保证至少有一块陆地。
输出
输出陆地周长的最大值。里面的边长也要算在内,例如上图中有四块陆地,最长周长是12 + 4=16。第二长的周长是8,最小的周长是4。
样例输入
1 1
1
6 5
01110
01010
01110
00000
01010
10011
样例输出
4
16
题意
如上
题解
广搜,判断1的点四周,为0边长+1,为1和2不管
已经搜索过的点标记为2不和上面冲突
代码
1 #include<stdio.h> 2 #include<queue> 3 using namespace std; 4 5 struct point{int x,y;}; 6 int n,m,maxx; 7 char a[51][51]; 8 int dx[]={-1,1,0,0}; 9 int dy[]={0,0,-1,1}; 10 11 int bj(int x,int y)//边界 12 { 13 if(x>=0&&x<n&&y>=0&&y<m) 14 return 1; 15 return 0; 16 } 17 18 int check(int x,int y)//1四周,如果是0边+1 19 { 20 int xx,yy,sum=0; 21 for(int i=0;i<4;i++) 22 { 23 xx=x+dx[i]; 24 yy=y+dy[i]; 25 if(bj(xx,yy)) 26 { 27 if(a[xx][yy]=='0') 28 sum++; 29 } 30 else 31 sum++; 32 } 33 return sum; 34 } 35 36 void bfs(int x,int y) 37 { 38 queue<point> qu; 39 point h,t; 40 41 int sum=0;//一块的总周长 42 h.x=x;h.y=y; 43 sum+=check(h.x,h.y); 44 a[h.x][h.y]='2'; 45 qu.push(h); 46 47 while(!qu.empty()) 48 { 49 h=qu.front(); 50 qu.pop(); 51 for(int i=0;i<4;i++) 52 { 53 t.x=h.x+dx[i]; 54 t.y=h.y+dy[i]; 55 if(bj(t.x,t.y)&&a[t.x][t.y]=='1') 56 { 57 sum+=check(t.x,t.y); 58 a[t.x][t.y]='2';//这里标记为2,如果标记为0的话算周长会多算 59 qu.push(t); 60 } 61 } 62 } 63 if(sum>maxx) 64 maxx=sum; 65 } 66 int main() 67 { 68 while(scanf("%d%d",&n,&m)!=EOF) 69 { 70 maxx=0; 71 getchar(); 72 for(int i=0;i<n;i++) 73 gets(a[i]); 74 for(int i=0;i<n;i++) 75 for(int j=0;j<m;j++) 76 if(a[i][j]=='1') 77 bfs(i,j); 78 printf("%d ",maxx); 79 } 80 return 0; 81 }