C++ 实现球迷 今日头条面试题
作者:FXY_ssf 发布时间:2022-07-08 11:03:24
试题描述:
一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。
球迷选座特性:同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);
给定一个M*N的二维球场,0代表该位置没人,1代表该位置有人,希望输出球队群体个数P,最大的球队群体人数Q。
输入:
第一行,2个数字,M、N,使用英文逗号隔开。
接下来M行,每行N个数字,使用英文逗号隔开。
输出:
一行,2数字,P和Q。
输入样例:
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<=3e3。
这道题是一道明显的深度优先搜索,而且十分简单。
但是在看到输入示例后会发现每个数据的后面都存在着一个字符,而且回车也属于字符。
所以我们要先对数据进行处理。
我们需要使用的的辅助工具就是getchar()了,不知道的人可以把getchar()作为一个爪子,每当一个char类型的字符被输入后,getchar()就可以准确的捕捉到他。
但是getchar()是会忽略每行第一个字符的。
所以我们可以定义一个数组,在取完第一个数后再使用getchar()。就可以把所有的0和1存储在一个n*m的二维数组中了。
再说dfs,就十分简单了,只需要判断可能走的8个方向,再使用一个计数器计数就可以了。
但是为了避免走重复的路,也是为了避免时间超限。所以我们可以定义一个bool类型的数组,记录走过的路。
同时在主函数中做写一个两层的嵌套循环,找到每个1,再进行dfs。
也要注意使用scanf和printf。
在最后也需要使用一个putchar(),相当于是输出一个字符。
论速度那个快 putchar(),getchar>scanf,printf>cin,cout。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<stdio.h>
using namespace std;
int n,m,l,k,sum,ans,cnt;
char a[4000][4000],op;
bool b[4000][4000]={0};
int dfs(int x,int y)
{
if(a[x-1][y]=='1'&&b[x-1][y]==0)
{
b[x-1][y]=1;
dfs(x-1,y);
ans++;
}
if(a[x][y+1]=='1'&&b[x][y+1]==0)
{
b[x][y+1]=1;
dfs(x,y+1);
ans++;
}
if(a[x-1][y+1]=='1'&&b[x-1][y+1]==0)
{
b[x-1][y+1]=1;
dfs(x-1,y+1);
ans++;
}
if(a[x+1][y]=='1'&&b[x+1][y]==0)
{
b[x+1][y]=1;
dfs(x+1,y);
ans++;
}
if(a[x][y-1]=='1'&&b[x][y-1]==0)
{
b[x][y-1]=1;
dfs(x,y-1);
ans++;
}
if(a[x+1][y-1]=='1'&&b[x+1][y-1]==0)
{
b[x+1][y-1]=1;
dfs(x+1,y-1);
ans++;
}
if(a[x+1][y+1]=='1'&&b[x+1][y+1]==0)
{
b[x+1][y+1]=1;
dfs(x+1,y+1);
ans++;
}
if(a[x-1][y-1]=='1'&&b[x-1][y-1]==0)
{
b[x-1][y-1]=1;
dfs(x-1,y-1);
ans++;
}
return ans;
}
int main()
{
scanf("%d%c%d",&n,&op,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
getchar();
a[i][j]=getchar();
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans=0;
if(a[i][j]=='0')b[i][j]=1;
if(a[i][j]=='1'&&b[i][j]==0)
{
sum++;
cnt=max(cnt,dfs(i,j));
}
}
}
char p=',';
printf("%d",sum);
putchar(p);
printf("%d",cnt);
}
总结
以上所述是小编给大家介绍的C++ 实现球迷 今日头条面试题网站的支持!
来源:https://www.cnblogs.com/FXY-180/p/9492160.html


猜你喜欢
- 本文实例讲述了基于JavaMail API收发邮件的方法。分享给大家供大家参考。具体如下:1.JavaMail API按其功能划分通常可分为
- 前提概要:上一篇文章已经介绍过了RecyclerView的基本使用方法,原文如下:android RecyclerView布局真的只是那么简
- 左右滑动是智能手机最常用的动作,在此简单的封装了一下,以后直接拿来用就可以了。简单的只需要几行就可以了,下面那个类是封装好了的。packag
- 事务处理基本原理 事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到
- Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他
- 程序结构:一、配置 1. 在pom.xml中添加依赖pom.xml文件如下:<?xml version="1.0&
- 本文实例为大家分享了WheelPicker自定义时间选择器控件的具体代码,供大家参考,具体内容如下先上图:使用android自带的DateP
- 目录1)在程序集中添加资源2)在程序集中查找资源这一篇单独拿出来分析这个程序集资源,为的就是不想让大家把程序集资源和exe程序强关联,因为程
- 1. C#实现复数类我们在进行信号分析的时候,难免会使用到复数。但是遗憾的是,C#没有自带的复数类,以下提供了一种复数类的构建方法。复数相比
- 1、JObject:基本的json对象/// <summary> /// Gets the j obj
- 双色球选号规则红球是1~33选6个,蓝球1~16选1个。它有17721088种排列组合,这个代码实现了如何将一组双色球号码 转换成第n个排列
- 这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary和ToLook
- [LeetCode] 2. Add Two Numbers 两个数字相加You are given two non-empty&n
- 案例简述通过C#使用类似QQ窗体的功能,当窗体放置到屏幕的边缘,可以将窗体隐藏,当鼠标再次放置到屏幕边缘时,窗体可再次显示。预备知识导图功能
- 数据库事务是后端开发中不可缺少的一块知识点。Spring为了更好的支撑我们进行数据库操作,在框架中支持了两种事务管理的方式: 编程式事务声明
- 下面就来分享工具类的内容:使用范围:JavaBean类对象的属性不能是数组、List、Set、Mappublic class MapBean
- Qt的版本发布越来越频繁,Qt6发布已经有一段时间了,越来越多的人咨询之前的代码是否可以增加对Qt6的支持,包括开源的项目QWidgetDe
- 为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平。你的一个决定会影响团队未来的几年。要考虑方面太多:
- 使用通配符增强泛型1.题目泛型是JAVA重要的特性,使用泛型编程,可以使代码复用率提高。实现:在泛型方法中使用通配符2.解题思路创建一个类:
- 本文实例为大家分享了DrawerLayout和触摸事件分发实现抽屉侧滑效果的具体代码,供大家参考,具体内容如下效果展示 还是看代码实在,直接