洛谷P1234 小 A 的口头禅

文章介绍了如何解决一个编程问题,该问题涉及到在给定的矩阵中寻找特定序列hehe。作者解析了题目的歧义,明确了搜索条件,并提供了一个通用的搜索函数,通过调整偏移矢量进行正向和逆向的横向和纵向搜索。最后给出了通过所有测试的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面:

hehe!好久没有看到这么令人愉悦的题面哩

解题:

题面有点歧义,这里解释一下:听取了几次惨烈的“WA声一片!”……

我成功测出了本题的判题标准:

只将横着、竖着的(正、反都算)的“hehe”记录答案,斜着的不算……

这也汰氵水沝淼㵘了吧!

hehe!我们来构建一个判断函数

注意:我给这个函数传入了四个参数

void myJudge(int x, int y, int t_x, int t_y);

注:(x,y)为搜索起点的坐标,t_xt_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_xt_y乘上循环形参i,

那么就可以实现对从(x , y)到 ( x + t_x * n , y + t_y * n ) 的这段空间的搜索,

因此,我们可以根据题目要求,传入可以实现下列四种搜索的t_xt_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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值