• 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
    ",maxx);
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    [20220314]利用vim下使用gdb进行各种进制转换插件.txt
    [20220228]enq TX allocate ITL entry的测试3.txt
    php输出json时,如何将空数组转为空对象
    C# String 前面不足位数补零的方法
    Gitlab权限管理
    Sql Server 存储乱码,出现问号?显示
    【填坑】处理:java: 错误: 不支持发行版本 5
    运行从sapui5官网下载代码的方法
    通过Fiori app的名字,找到sewg里的project
    SAPUI5 Fiori课程计划
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8417389.html
Copyright © 2020-2023  润新知