TZOJ 5279 马拉松比赛(广搜)

描述

有一块矩形的海域,其中有陆地也有海洋,这块海域是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\n",maxx);
79     }
80     return 0;
81 }

posted on 2018-02-05 14:18  大桃桃  阅读(188)  评论(0)    收藏  举报

导航