• 18年今日头条笔试第一题题解:球迷(fans)


    其实本题是加强版,原数据是100*100的,老师为了尊重我们的智商加成了3000*3000并进行了字符串处理……

    上原题~


    球迷

    【问题描述】

    一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。

    球迷选座特性:同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);

    给定一个M*N的二位球场,0代表该位置没人,1代表该位置有人,希望输出球队群体个数P,最大的球队群体人数Q。

    【输入】

    第一行,2个数字,M、N,使用英文逗号隔开。

    接下来M行,每行N个数字,使用英文逗号隔开。

    【输出】

    一行,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 }
  • 相关阅读:
    C语言-错误处理
    C语言-排序和查找
    PCB设计要点
    C语言-调试
    c++ 概述
    C语言-指针
    C语言-数组与指针 字符与字符串
    C语言-(void*)类型指针
    C语言-字符操作函数
    C语言-链表
  • 原文地址:https://www.cnblogs.com/Semora-2004/p/9487782.html
Copyright © 2020-2023  润新知