字符匹配


字符匹配

题目描述

##算法设计
算法关键:

  1. 遍历子数组左上角

    i从0到n-b+1,j从0到m-a+1

    遍历这个子数组,不相同ret就设为0;

输入处理

扫描n,m,a,b

A[n][m]存原矩阵

扫描q

q次循环

​ B[a][b]存子矩阵

​ 调用算法

​ 将结果存在ans数组中

代码很简单

    int n, m, a, b;
    scanf("%d%d%d%d", &n, &m, &a, &b);
    char A[n][m];
    char B[a][b];
    for (int i = 0; i < n; ++i) {
        scanf("%s",A[i]);
    }
    int q;
    scanf("%d", &q);
    int ans[q];
    int valEn = 0;
    for (int i = 0; i < q; ++i) {
        //存B
        for (int j = 0; j < a; ++j) {
            scanf("%s",B[j]);
        }

运算

按照算法写出代码

    int n, m, a, b;
    scanf("%d%d%d%d", &n, &m, &a, &b);
    char A[n][m];
    char B[a][b];
    for (int i = 0; i < n; ++i) {
        scanf("%s",A[i]);
    }
    int q;
    scanf("%d", &q);
    int ans[q];
    int valEn = 0;
    for (int i = 0; i < q; ++i) {
        //存B
        for (int j = 0; j < a; ++j) {
            scanf("%s",B[j]);
        }

测试运行

矩阵是char类型的,加上一些对缓冲区的修改

加入调试语句输出A、B

#ifdef DEBUG
        for (int j = 0; j < m; ++j) {
            for (int k = 0; k < n; ++k) {
                printf("%c ", A[j][k]);
            }
            printf("\n");
        }
        printf("\n");
        for (int j = 0; j < a; ++j) {
            for (int k = 0; k < b; ++k) {
                printf("%c ", A[j][k]);
            }
            printf("\n");
        }
#endif

输入正常了

测试

发现是比较时对B的调用有问题,改为列指针调用B

删除标志变量,改用更简洁的goto:但凡不相等,就到结束标记点

    int ans[q];
    int valEn = 0;
    for (int i = 0; i < q; ++i) {
        //存B
        for (int j = 0; j < a; ++j) {
            scanf("%s", B[j]);
        }
        //解决
        int count = 0;
        for (int j = 0; j < n - b + 1; ++j) {
            for (int k = 0; k < m - a + 1; ++k) {//a[j][k]是子数组左上角元素
                int num = 0;
                char *p = B[0];
                for (int hang = j; hang < j + a; ++hang) {
                    for (int lie = k; lie < k + b; ++lie) {
                        if (A[hang][lie] != p[num++]) {
                            goto end;
                        }
                    }
                }
                count++;
                end:;
            }
        }
        ans[valEn++] = count;
    }

样例正确

样例正确

但是WA了

习惯了。。。。

测试一下

确实没看出来有啥问题


文章作者: 喵寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 喵寒 !
评论
  目录