思路:
.....第一眼看题目首先想到的是暴力枚举。设置两个计数变量count和Count,用来记录是否满足条件“face”全部存在以及满足条件字符框的总数。在(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)中如果存在'f'/'a'/'c'/'e'那么count+1;当满足count的值为4时,则Count加1同时count清零。不断循环,直至遍历整个数组。
.....但是,由于题目描述说明在四个位置中字母没有真正的顺序,只要构成“四个字母都存在”即可,所以上述方法实现起来会造成分支条件过多,构成冗长复杂的编码。于是考虑反向条件:在(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)中如果不存在'f'/'a'/'c'/'e'中的任意一个,那么就检查下一个元素。否则计数变量数值加一。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int str[50][50];
int main()
{
    int n=0,m=0,count=0;
    scanf("%d%d",&n,&m);               //输入行和列的数目n、m
    getchar();                        //注意输入格式时的换行符号
    for(int i=0;i<n;i++)              //读取输入字符到数组
    {
        for(int j=0;j<m;j++)
        {
            scanf("%c",&str[i][j]);
        }
        getchar();                   //注意输入格式中的换行符号
    }
    for(int i=0;i<n;i++)             //遍历数组中每个元素右下对角方向元素是否满足条件
    {
        for(int j=0;j<m;j++)
        {
            if(str[i][j]!='f'&&str[i][j+1]!='f'&&str[i+1][j]!='f'&&str[i+1][j+1]!='f')
                continue;            //当四个元素中不存在'f'时直接访问下一个元素
            else if(str[i][j]!='a'&&str[i][j+1]!='a'&&str[i+1][j]!='a'&&str[i+1][j+1]!='a')
                continue;            //当四个元素中不存在'a'时直接访问下一个元素
            else if(str[i][j]!='c'&&str[i][j+1]!='c'&&str[i+1][j]!='c'&&str[i+1][j+1]!='c')
                continue;            //当四个元素中不存在'c'时直接访问下一个元素
            else if(str[i][j]!='e'&&str[i][j+1]!='e'&&str[i+1][j]!='e'&&str[i+1][j+1]!='e')
                continue;            //当四个元素中不存在'e'时直接访问下一个元素
            else count++;            //否则计数变量加一,表示存在构成‘face’的元素
        }
    }
    printf("%d",count);               //输出所求计数变量
    return 0;
}

如果大家有其他不一样的思路和方法也可以在下面补充。或者有什么意见或建议也可以提出来。