米哈游春招后端-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;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
米哈游Java后端笔试真是面向Java后端开发岗位的一套笔试目,旨在考察应聘者对Java后端开发的理解和应用能力。 这套笔试目往往包含以下几个方面的内容: 1. Java语言基础:主要考察Java的基本语法、面向对象编程、常用类库等方面的知识。例如,常见的有关Java语言基础的目有:反射机制的理解和应用、线程的创建和使用、异常处理等。 2. 数据库相关知识:主要考察应聘者对数据库的基本理解和SQL的使用能力。例如,常见的数据库相关目有:数据库事务的概念和应用、数据库索引的优化策略、SQL语句的编写和调优等。 3. Web开发框架:主要考察应聘者对常用的Web开发框架的理解和应用能力。例如,常见的Web开发框架目有:Spring框架的注解使用、MyBatis的配置和映射关系等。 4. 系统设计和优化:主要考察应聘者对大型系统设计和性能优化的能力。例如,常见的系统设计和优化目有:数据库连接池的设计和实现、分布式系统的负载均衡策略、系统性能调优等。 总的来说,米哈游Java后端笔试真是一套综合考察Java后端开发能力的目,内容涵盖了Java语言基础、数据库相关知识、Web开发框架以及系统设计和优化等方面。应聘者需要具备扎实的Java编程基础,熟悉常用的开发框架和工具,以及对大型系统的设计和性能优化有一定的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值