题面:

hehe!好久没有看到这么令人愉悦的题面哩
解题:
题面有点歧义,这里解释一下:听取了几次惨烈的“WA声一片!”……
我成功测出了本题的判题标准:
只将横着、竖着的(正、反都算)的“hehe”记录答案,斜着的不算……
这也汰氵水沝淼㵘了吧!
hehe!我们来构建一个判断函数
注意:我给这个函数传入了四个参数
void myJudge(int x, int y, int t_x, int t_y);
注:(x,y)为搜索起点的坐标,t_x 、t_y分别为横、纵方向的偏移矢量
偏移矢量是什么?别急,先来看看完整函数代码
void judgeP(int x, int y, int t_x, int t_y) //(x,y)为搜索起点的坐标,t_x、t_y分别为横、纵方向的偏移矢量
{
if (r[x][y] != 'h')return; //第一个字符必须以h开头,否则退出搜索
for(int i=1;i<=3;i++)
{
if (i % 2 && r[x + t_x * i][y + t_y * i] != 'e')return; //搜索第2/4位的'e'字符
if (!(i % 2) && r[x + t_x * i][y + t_y * i] != 'h')return; //搜索第3位的'h'字符
}
ans++;
}
这段代码反应的信息是:调用函数myJudge( )时,我们传入x , y的起始坐标,
搜索坐标:( x + t_x , y + t_y ) 的值,将t_x、t_y乘上循环形参i,
那么就可以实现对从(x , y)到 ( x + t_x * n , y + t_y * n ) 的这段空间的搜索,
因此,我们可以根据题目要求,传入可以实现下列四种搜索的t_x、t_y:
正向横向搜索: t_x=1 & t_y=0 搜索(x+1,y)、(x+2,y)、(x+3,y);
逆向横向搜索: t_x=-1 & t_y=0 搜索(x-1,y)、(x-2,y)、(x-3,y);
正向纵向搜索: t_x=0 & t_y=1 搜索(x,y+1)、(x,y+2)、(x,y+3);
逆向纵向搜索: t_x=0 & t_y=-1 搜索(x,y-1)、(x,y-2)、(x,y-3);
注:线型搜索(包括斜向)均可以通过这种方法实现,一个函数可作万能函数
AC代码奉上:
#include<iostream>
using namespace std;
char r[1005][1005]; //储存矩阵
int n, m, ans = 0; //n行m列
void judgeP(int x, int y, int t_x, int t_y) //(x,y)为搜索起点的坐标,t_x、t_y分别为横、纵方向的偏移矢量
{
if (r[x][y] != 'h')return; //第一个字符必须以h开头,否则退出搜索
for(int i=1;i<=3;i++)
{
if (i % 2 && r[x + t_x * i][y + t_y * i] != 'e')return; //搜索第2/4位的'e'字符
if (!(i % 2) && r[x + t_x * i][y + t_y * i] != 'h')return; //搜索第3位的'h'字符
}
ans++;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> r[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
judgeP(i, j, 1, 0); //正横向查找
judgeP(i, j, -1, 0); //逆横向查找
judgeP(i, j, 0, 1); //正竖向查找
judgeP(i, j, 0, -1); //逆竖向查找
}
cout << ans << endl;
return 0;
}