#include <stdio.h> int main() { int n, m; // 定义网格的行数和列数 scanf("%d %d", &n, &m); // 读取网格的行数和列数 char grid[50][50]; // 定义一个最大支持 50x50 的网格 // 输入网格数据 for (int i = 0; i < n; i++) { scanf("%s", grid[i]); // 读取网格的每一行 } int count = 0; // 计数器,用来统计符合条件的2x2方格数量 // 遍历所有可能的2x2方格的左上角位置 for (int i = 0; i < n - 1; i++) { // 行范围:0 到 n-2 for (int j = 0; j < m - 1; j++) { // 列范围:0 到 m-2 // 获取当前2x2方格的四个字符 char chars[4] = { grid[i][j], // 左上 grid[i][j+1], // 右上 grid[i+1][j], // 左下 grid[i+1][j+1] // 右下 }; // 用一个简单的数组来模拟集合,避免重复 char unique_chars[4]; // 用于存储不重复的字符 int unique_count = 0; // 用于记录唯一字符的数量 // 遍历 4 个字符,去重 for (int k = 0; k < 4; k++) { int found = 0; // 记录是否已经存在该字符 for (int l = 0; l < unique_count; l++) { if (chars[k] == unique_chars[l]) { found = 1; // 如果字符已经在 unique_chars 中,标记为已找到 break; } } if (!found) { // 如果字符没有重复,则加入到 unique_chars 中 unique_chars[unique_count++] = chars[k]; } } // 判断是否包含 'f', 'a', 'c', 'e' 四个字符 if (unique_count == 4) { int has_f = 0, has_a = 0, has_c = 0, has_e = 0; // 检查每个字符是否存在 for (int k = 0; k < 4; k++) { if (unique_chars[k] == 'f') has_f = 1; if (unique_chars[k] == 'a') has_a = 1; if (unique_chars[k] == 'c') has_c = 1; if (unique_chars[k] == 'e') has_e = 1; } // 如果包含 'f', 'a', 'c', 'e',则计数 if (has_f && has_a && has_c && has_e) { count++; } } } } // 输出符合条件的2x2方格数量 printf("%d\n", count); return 0; }