思路:
.....第一眼看题目首先想到的是暴力枚举。设置两个计数变量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; }
如果大家有其他不一样的思路和方法也可以在下面补充。或者有什么意见或建议也可以提出来。