题目内容
米小游拿到了一个矩阵,矩阵上有一格有一个颜色,为红色( R )。绿色( G )和蓝色( B )这三种颜色的一种。
然而米小游是蓝绿色盲,她无法分游蓝色和绿色,所以在米小游眼里看来,这个矩阵只有两种颜色,因为蓝色和绿色在她眼里是一种颜色。
米小游会把相同颜色的部分看成是一个连通块。请注意,这里的连通划是上下左右四连通的。
由于色盲的原因,米小游自己看到的连通块数量可能比真实的连通块数量少。
你可以帮米小游计算连通块少了多少吗?
输入描述
第一行输入两个正整数 nn 和 mm ,代表矩阵的行数和列数。
接下来的 nn 行,每行输入一个长度为 mm 的,仅包含 R 、G 、B 三种颜色的字符串,代表米小游拿到的矩阵。
1\le n,m\le 10001≤n,m≤1000
输出描述
一个整数,代表米小游视角里比真实情况少的连通块数量。
样例
输入
2 6
RRGGBB
RGBGRR
输出
3
样例解释
米小游视角里有 33 个连通块,而实际上有 66 个连通块,所以米小游视角的连通块数量比真实情况少了 33 个。
import java.util.Scanner;
public class mhy01 {
static int[][] mv = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
static boolean[][] vis = new boolean[1010][1010];
static boolean[][] vis2 = new boolean[1010][1010];
static String[] strings = new String[1010];
static int n;
static int m;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
for (int i = 0; i < n; i++) {
strings[i] = scanner.next();
}
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cnt += dfs1(i, j);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cnt -= dfs2(i, j);
}
}
System.out.println(cnt);
}
static public int dfs1(int x, int y) {
if (x < 0 || x >= n) return 0;
if (y < 0 || y >= m) return 0;
if (vis[x][y]) return 0;
if (!vis[x][y]) vis[x][y] = true;
for (int i = 0; i < 4; i++) {
if (x + mv[i][0] < 0 || x + mv[i][0] >= n) continue;
if (y + mv[i][1] < 0 || y + mv[i][1] >= m) continue;
if (strings[x + mv[i][0]].charAt(y + mv[i][1]) == strings[x].charAt(y)) {
dfs1(x + mv[i][0], y + mv[i][1]);
}
}
return 1;
}
static public int dfs2(int x, int y) {
if (x < 0 || x >= n) return 0;
if (y < 0 || y >= m) return 0;
if (vis2[x][y]) return 0;
if (!vis2[x][y]) vis2[x][y] = true;
for (int i = 0; i < 4; i++) {
if (x + mv[i][0] < 0 || x + mv[i][0] >= n) continue;
if (y + mv[i][1] < 0 || y + mv[i][1] >= m) continue;
if (strings[x + mv[i][0]].charAt(y + mv[i][1]) == strings[x].charAt(y)
|| ((strings[x + mv[i][0]].charAt(y + mv[i][1]) == 'G' || strings[x + mv[i][0]].charAt(y + mv[i][1]) == 'B')
&& (strings[x].charAt(y) == 'B' || strings[x].charAt(y) == 'G'))
) {
dfs2(x + mv[i][0], y + mv[i][1]);
}
}
return 1;
}
}