米哈游春招后端-2023.03.19-第一题-米哈游的RBG矩阵-简单

Posted 新时代原始人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了米哈游春招后端-2023.03.19-第一题-米哈游的RBG矩阵-简单相关的知识,希望对你有一定的参考价值。

米哈游的RBG矩阵

Problem Description

米小游拿到了一个矩阵,矩阵上有一格有一个颜色,为红色( R )。绿色( G )和蓝色( B )这三种颜色的一种。
然而米小游是蓝绿色盲,她无法分游蓝色和绿色,所以在米小游眼里看来,这个矩阵只有两种颜色,因为蓝色和绿色在她眼里是一种颜色。
米小游会把相同颜色的部分看成是一个连通块。请注意,这里的连通划是上下左右四连通的。
由于色盲的原因,米小游自己看到的连通块数量可能比真实的连通块数量少。 你可以帮米小游计算连通块少了多少吗?

input

第一行输入两个正整数 n 和 m,代表矩阵的行数和列数。接下来的 n 行,每行输入一个长度为m 的,仅包含 R 、G 、B
三种颜色的字符串,代表米小游拿到的矩阵。 1≤n,m≤1000

ouput

一个整数,代表米小游视角里比真实情况少的连通块数量。

Sample Input

2 6
RRGGBB
RGBGRR

Sample Output

3

题目类型、难度、来源

总体思路:

  • 此题就是求一个图的联通分量数量。可以用并查集也可以用DFS、BFS。方法很多,数据集也不打,我这里为了写代码方便,就用了DFS。

AC代码

#include <iostream>
using namespace std;
// flag=1: 米小游视角
int n, m;
bool same_color(char &c1, char &c2, bool flag)
    if (c1 == c2)
        return true;
    else if (flag)
        return (c1 + c2 == 'B' + 'G');
    
    return false;

void DFS(char **G, bool **visted,bool &flag, int i, int j)
    visted[i][j] = 1;
    if (i+1 < n)
        if (same_color(G[i+1][j], G[i][j], flag) && !visted[i+1][j]) 
            DFS(G, visted, flag, i+1, j);
         
    
    if (j+1 < m)
        if (same_color(G[i][j+1], G[i][j], flag) && !visted[i][j+1])
            DFS(G, visted, flag, i, j+1);
        
    
    if (i-1 >= 0)
        if (same_color(G[i-1][j], G[i][j], flag) && !visted[i-1][j])
            DFS(G, visted, flag, i-1, j);
         
    
    if (j-1 >= 0)
        if (same_color(G[i][j-1], G[i][j], flag) && !visted[i][j-1])
            DFS(G, visted, flag, i, j-1);
         
    

int get_num(char **G, bool flag, int n, int m)
    bool **visted = new bool*[n];
    for (int i = 0; i < n; i++)
        visted[i] = new bool[m];
    
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            visted[i][j] = false;
        
    
    int cnt = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (visted[i][j])   continue;
            DFS(G, visted, flag, i, j);
            cnt++;
        
    
    return cnt;

int main()
    cin >> n >> m;
    char **G = new char*[n];
    for (int i = 0; i < n; i++)
        G[i] = new char[m];
        for (int j = 0; j < m; j++)
            cin >> G[i][j];
        
    
    int cnt1 = get_num(G, 0, n, m);
    int cnt2 = get_num(G, 1, n, m);
    cout << cnt1-cnt2;
    return 0;

围观|第一代云原生企业米哈游如何让想象发生?


在米哈游的办公区,有一间会议室,专门留给了阿里云工程师。

今年,是这家二次元文化公司创立的第九年,米哈游和阿里云的交情,也有八年了。

米哈游总裁刘伟还记得多年前,王坚博士带着八位公司高管和负责团队抵达米哈游办公室时的情景。那天,在米哈游租用的小小的办公区中,只有 30 多个工位,甚至没有一间会议室能同时容纳这十来名访客。

那时,米哈游创立不久,阿里云也还在对外服务的起步阶段,两个初出茅庐的小兄弟机缘巧合走到了一起,彼此摸索着前行。

那一天,王坚博士讲了这样一段话:“如果客户坐着飞机在天上飞,我们只在地上看,是很容易出故障的。要做,我们就和客户一起在天上飞。”

临走时,王坚博士将自己的手机号写给了刘伟。他说,有任何问题,直接打电话给我。

许多年过去了,所幸,这样的一通电话从未拨出去。而阿里巴巴核心系统也早已实现 100% 上云,验证了那句“和客户坐在同一架飞机上”。

时间一晃而过。2020 年 9 月,在米哈游与阿里云并行的第八年,这家二次元文化公司上线了最新的代表作《原神》,全球五大区服完全承载在阿里云上。

在这一年年底,《原神》像游戏行业的一匹黑马,热度节节上升。

11 月 30 日,谷歌将 Google Play 2020 年度最佳游戏颁发给了《原神》;仅一天后,苹果又将 App Store 2020 iPhone 年度游戏交给了《原神》。

这可能是中国游戏首次获得“双冠”殊荣。

在这一年,阿里云也早已从当年的小兄弟成长为云计算行业的领军者,成为许多行业的数字化底座,也为许多中国游戏企业提供服务。

从“相信”开始


回到 2012 年,米哈游刚刚做出二次元游戏《崩坏学园》。

那一年,手游市场还处于起步阶段,动漫游戏更是开发者寥寥,环顾 App Store,没有几个成型的手机动漫游戏。但在米哈游心里,未来的游戏市场,一定有国产动漫的一席之地。

巧合的是,云计算的行业阶段和动漫游戏有些类似。作为一个新生技术,中国的云计算行业起步不久,但米哈游和阿里云都有着一个关于未来的梦想。

没有人知道未来如何抵达,“相信”就是唯一的路径。

传统IT时代,游戏公司的做法是自己购买服务器、自建机房、配置运维人员。这样斥巨资才能启动的重模式,将许多有想法的创业者挡在了游戏行业的门外,在那个时期,研发游戏几乎只能是大公司的专利。

云计算带来了一个新机会——跳过一切前期的 IT 设施投入,直接在网页上点点鼠标,就能调用云算力。这几乎是为米哈游这样的创业团队量身定制的完美产品。

围观|第一代云原生企业米哈游如何让想象发生?
米哈游创始团队早期合影

“崩 1”上线时,使用了阿里云的两台云服务器,小小的尝试,开启了米哈游的“云上之旅”。

回顾起来,米哈游可以说是一代互联网创业企业的代表。诞生在云端,所有业务都在云上,率先感受着云计算高弹性、高并发、低成本等种种特色,堪称“云原生企业”。

也正是这一代“云原生企业”的快速成长,推动着中国云计算的发展与普及。

2016 年,米哈游上线了第三款游戏:《崩坏 3》。但在此时,米哈游仍只有两名运维人员——在传统自建服务器机房的时代,这几乎是不可想象的。

作为早期云计算的“吃螃蟹”用户,米哈游踩过坑。

“问题是很难避免的,关键是能不能解决问题。”米哈游的技术负责人刘霄回忆说。

一年年过去,米哈游也渐渐成长起来,从三个人到几十人,再到几百、上千人,不再是那个没有会议室的小团队。

米哈游也为阿里云工程师们专门留了一间会议室,对他们说,“随时来、随时用”。

“取道”阿里云,安全出海


起初,米哈游规模尚小,在拓展海外市场的过程中也遇到了一些波折。

“所幸当初规模小,用户不算多,这件事的负面影响还能控制。如果是在“崩 3”、《原神》这样规模的游戏上,那损失就不可估量了。”回想起来,刘霄还有些后怕,“所以应该说,对于大部分游戏公司,云就是最好的选择,没有之一。”

围观|第一代云原生企业米哈游如何让想象发生?

2016 年,米哈游正式开启全面“出海”。在海外服务区,《崩坏 3》最初选择了一家海外云服务商,却遭遇了几次黑客的 DDoS 攻击,更有一次甚至影响用户正常访问。

这是一种非常恶意的网络攻击方法:黑客在短时间内向服务器发起大量请求,造成网络拥塞,导致正常用户无法访问。

举个更形象的例子,比如一家容纳 100 人的餐厅开业了,隔壁餐厅看着不高兴,雇了 150 个小流氓涌入这家餐厅,光坐着不吃饭,把所有空间占满了。结果,想来吃饭的普通客人都进不来。

为了防御攻击,米哈游还曾购买了额外的安全防护服务,由于技术支持和沟通效率问题,状况没有及时得到改善。

苦恼中,米哈游想起了阿里云,与阿里云工程师们合计一番,想出了一个方法——将玩家请求先通过阿里云高防 IP,经过流量清洗后,再转回原机房,从而抵挡了上百 GB 的 DDoS 攻击。

困扰米哈游许久的问题,一举就被解决。

时间已经走到了 2017 年。经过几年努力,阿里云在全球的基础设施也越建越多,在那一年底,阿里云在全球拥有 17 个区域、53 个可用区,遍布亚、欧、美各地。

对于米哈游来说,此时此刻,应该是将“崩 3”全部迁至阿里云的最佳时机了。

后来,在筹划《原神》时,米哈游没有再犹豫,《原神》的全球资源,全部直接上阿里云。截至目前,曾经遭遇的海外黑客攻击,未在《原神》上出现过。

《原神》,一个前所未有的挑战


《原神》,是米哈游和阿里云共同面临的一次巨大挑战。

《原神》的规划有多宏伟?这不仅是一款开放世界游戏——意味着庞大的地图和人物画面、复杂的关卡设计和故事情节。更有难度的是,米哈游想做一款多平台、全球同步公测的游戏,也就是 PS4、iOS、Android、PC 等所有游戏平台,和全球五大服务区同时开服、同时上线,相同服务区内数据互通、无缝衔接。

例如在手机上玩《原神》,切换到电脑上,玩法和进度都可以无缝衔接。

围观|第一代云原生企业米哈游如何让想象发生?

而且,为了更好的联机游戏体验,米哈游采取的是“大通服”。

大部分游戏公司会采用“分服”的方式,一个区域内有很多个服务器,玩家达到一定数量后再增加服务器。但“通服”是将一个大区的所有用户都放在同一个服务器集群上,玩家的在线数骤增。

也就是说,等到《原神》上线的那一天,全球、全服的用户一起涌入,一时的 PCU(最高在线玩家人数)可能会远远超出日常预估。

如果米哈游能设计出这样一款产品,那么,面对这样高并发、高性能、高弹性的技术需求,阿里云能支持吗?

有些人感到忐忑,但是米哈游一如既往地选择了阿里云。这种信任源自于双方多年的合作。

米哈游对阿里云太熟了,这些年,他们看到了阿里云支撑着淘宝天猫度过了一次次 双11,每一年,阿里云支撑的计算峰值都会再高一些。

“虽然我们不是电商,但游戏和技术对于高并发的需求非常相似,从 双11 来看,我们相信阿里云的技术能力是足够的。”

他们也看到了阿里云在快速地进步。2017 年,阿里云上线了自研数据库 PolarDB,能够提供分钟级的配置升降级、秒级的故障恢复、全局数据一致性和数据备份容灾服务。

对于米哈游来说,原本在使用老式的数据库时,备份数据耗时几个小时,游戏不得不停服一个多小时;而在 PolarDB 上,备份工作能够被缩短至秒级,大大减少了数据备份的耗时,提升了版本更新效率。

2020 年 7 月,《原神》同时在 PS4、iOS、Android、PC 平台开启最终内测,进入了冲刺阶段。

欢迎来到提瓦特大陆


阿里云的工程师们又来到了那间熟悉的会议室。在最后冲刺的这两个月中,他们再次成为这里的常驻者,“把《原神》当作阿里自己的项目来做”。

阿里云多年累积的能力,成为《原神》宏大设想实现的技术基础。

比如,被工程师们称作“一套架构,全球部署”的资源保障能力。简单说,在全球不同的服务节点上,阿里云从基础层到数据库的一套架构产品,包括云服务器、网络资源、存储、安全、数据库等等,都采用了同一套架构,提供相同的性能体验。

这为《原神》“全球同时开服”的需求提供了基础保障,意味着米哈游在全球也只需要搭建一套架构,而不需要每到一个服务区就因地制宜地改一次架构。

同时,相同的性能,确保了全球五大区能够给予玩家们统一的游戏体验,不会造成“某些功能只有特定区域有,另一些区域缺失”的情况。

再比如,PolarDB 在满足《原神》高性能游戏数据库需求的同时,又凭借着完善的产品封装形态,降低了米哈游在 IT 运维上的投入,可以让全部人马专注在游戏本身。
“我们就专心做游戏上的设计,这些基础的 IT 工作,基本都交给阿里云了。”刘霄总结说。

这是阿里云在游戏领域最大的一次全面实战。《原神》对阿里云技术的一些需求,即使已在不同客户、不同领域实践过,但这样一次性挑战所有高难度动作的项目,还是第一次。

从全球部署和预约量来看,上线后,《原神》将成为全球在云上规模最大的游戏——几个月后,这成为一个事实。

所以,连阿里云熟悉的“热迁移”,在《原神》上都要进一步升级。

热迁移,意为将整个虚拟机的运行状态完整保存下来,同时快速恢复到原有或其他硬件平台上,同时,用户在使用层面不会察觉到任何差异。

通俗点说,这有点类似于行驶在高速公路上的汽车,发动机出现报警,需要不停车完成更换。

如果说“换汽车发动机”是一般状态,那么在《原神》上,就是一次给空中的超大型飞机换发动机的过程。而且,由于游戏对稳定性的极高要求,更换过程中,“飞机”不能有丝毫的抖动和偏移。

需求从米哈游的会议室里传递回阿里云的飞天园区,从游戏业务传递到虚拟化业务,不同部门的工程师聚在一起想方法,摸索出一套通过智能运维系统对底层性能进行调整,实现在超高 QPS、高 CPU 和内存负载场景下的无损“AI 热迁移”方法。

“AI 热迁移”应用在《原神》上,迄今为止,效果非常明显。

最后两个月中,《原神》的预约量节节攀升,对服务器的需求也越来越高。终于,在服务器完成了几十次扩容并连夜进行了压力测试后,工程师们感觉到,这次,成了!

围观|第一代云原生企业米哈游如何让想象发生?
9 月 28 日,阿里云团队在提瓦特会议室

9 月 28 日,《原神》全球同步公测开启,10 点,正式上线。

那间会议室里,阿里云的 20 多名工程师紧盯着大屏上的各个指数,一个又一个峰值出现。

最终,PCU 峰值达到了某一个数值,高于所有人的预期,但云稳稳扛住了压力。就像之前已经进行过的无数次压测一样,顺利,平静。

门外,贴着这间会议室的名字:提瓦特。

在提瓦特大陆上,被神选中的人将被授予“神之眼”,这些人被称为——原神。

2020 云原生实战峰会即将开启


米哈游是第一代云原生企业,是云原生落地企业的最佳样本,其云上蓬勃的成长路径可以给到更多企业落地云原生的参考。云原生时代已悄然来临,越来越多的企业看到了云原生的闪光点,如何落地云原生产生实际业务价值成为企业亟待解决的共同命题。

2020 年 12 月 23 日,阿里云将 在北京国贸大酒店召开以“云原生加速企业数字创新升级”为主题的 “2020 云原生实战峰会” 届时,众多行业领先企业技术管理者将出席本次会议,与广大开发者共同探讨云原生落地的最佳姿势,分享不同行业企业落地时的现状、挑战和创新实践,交流云原生避坑经验。

识别下方海报二维码 或直接点击“阅读原文”即可报名“2020 云原生实战峰会”,了解更多云原生企业故事!

<峰会详情一览>


戳原文,立即报名!

以上是关于米哈游春招后端-2023.03.19-第一题-米哈游的RBG矩阵-简单的主要内容,如果未能解决你的问题,请参考以下文章

2022-09-14米哈游秋招笔试三道编程题

米哈游前端面试难度

米哈游面试成功率高吗?

米哈游面试流程

围观|第一代云原生企业米哈游如何让想象发生?

Flink 在米哈游的落地实践