米哈游春招后端-2023.03.19-第一题-米哈游的RBG矩阵-简单
米哈游的RBG矩阵 Problem Description
米小游拿到了一个矩阵,矩阵上有一格有一个颜色,为红色( R )。绿色( G )和蓝色( B )这三种颜色的一种。
然而米小游是蓝绿色盲,她无法分游蓝色和绿色,所以在米小游眼里看来,这个矩阵只有两种颜色,因为蓝色和绿色在她眼里是一种颜色。
米小游会把相同颜色的部分看成是一个连通块。请注意,这里的连通划是上下左右四连通的。
由于色盲的原因,米小游自己看到的连通块数量可能比真实的连通块数量少。 你可以帮米小游计算连通块少了多少吗?input
第一行输入两个正整数 n 和 m,代表矩阵的行数和列数。接下来的 n 行,每行输入一个长度为m 的,仅包含 R 、G 、B
三种颜色的字符串,代表米小游拿到的矩阵。 1≤n,m≤1000ouput
一个整数,代表米小游视角里比真实情况少的连通块数量。
Sample Input
2 6
RRGGBB
RGBGRRSample Output
3
题目类型、难度、来源
- 类型:DFS、BFS、并查集
- 难度:简单
- 来源:米哈游春招后端-2023.03.19-第一题-米哈游的RBG矩阵
总体思路:
- 此题就是求一个图的联通分量数量。可以用并查集也可以用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;
}
- 更多大厂真题可以看:2023实习、秋招互联网大厂技术岗算法真题-刷题(持续更新)