小美定义一个矩阵是好矩阵,当且仅当该矩阵满足:
1. 矩阵仅由'A'、'B'、'C'三种字符组成。且三种字符都出现过。
2. 矩阵相邻的字符都不相等。
现在给定一个的矩阵,小美想知道有多少个3*3的子矩阵是好矩阵,你能帮帮她吗?
第一行输入两个整数,代表矩阵的行数和列数。
接下来的行,每行输入一个仅包含大写字母的长度为的字符串。
输出一个整数表示答案。
4 4 DABC ABAB BABA BBAB
1
有4个3*3的子矩阵。
左上角的子矩阵出现了'D',因此不合法。
右上角的是好矩阵。
左下角的存在两个相邻的字母相同,因此不合法。
右下角的子矩阵里没有'C',因此不合法。
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); scanner.nextLine(); char[][] matrix = new char[n][m]; for (int i = 0; i < n; i++) { matrix[i] = scanner.nextLine().toCharArray(); } int result = 0; // 好矩阵的数量 // 遍历每个3x3子矩阵 for (int i = 0; i <= n - 3; i++) { for (int j = 0; j <= m - 3; j++) { if (isGood(matrix, i, j)) { // 符合条件的使result++ result++; } } } System.out.println(result); } // 判断子矩阵是否满足2个条件 private static boolean isGood(char[][] matrix, int row, int col) { Set<Character> set = new HashSet<>(); for (int x = row; x < row + 3; x++) { for (int y = col; y < col + 3; y++) { char ch = matrix[x][y]; set.add(ch); // 相邻相等的话,跟右边和跟下面的字符相比较就OK if (ch >= 'D' || (y + 1 < col + 3 && ch == matrix[x][y + 1]) || (x + 1 < row + 3 && ch == matrix[x + 1][y])) { return false; } } } // 到了这一步表明相邻的字符没有相等的,只剩下判断ABC是否都出现过即可 return set.size() == 3; } }