2023 深信服笔试 0920

笔试时间:2023年9月20日 秋招

备注:第三题暂无题解

第一题

题目:馍馍检测病毒

馍馍发现了一种新型网络病毒,可以隐藏在图片中,图片可以简单的看成一个N X N的矩阵。这个矩阵每个格子要么是白,用字符'.'表示,要么是黑,用字符'#'表示。经过馍馍的分析,如果一张图片中包含一个特殊的 M  X M的矩阵,那么这张图片可能包含病毒。我们称M X M的阵为"馍来检测病毒的超生逼特征矩阵”。现在告诉你一个N X N的图片矩阵,和一个M X M的“来检测病毒的超生逼特征矩阵”。你需要判断该图片是否包含病毒。即“模馍来检测病毒的超牛逼特征矩阵”通过平移可以完全重合在图片中的一个子矩阵里。

输入描述

第一行一个整数T(1 <= T <= 5),表示测试数据的组数;

对于每组测试数据,第一行两个整数N, M(1 <= N,M <= 50);

接下来N行,每行N个字符,用来描述待判断的图片A;

接下来M行,每行M个字符,用来描述”馍馍来检测病毒的超牛逼特征矩阵”。

输出描述

共T行,对于每组测试数据,如果包含,输出“Yes”,否则输出"No”(不包括引号)。

样例输入

2

3 2

#.#

.#.

#.#

#.

.#

4 1

....

....

....

....

#

样例输出

Yes

No

参考题解

枚举做法,枚举原矩阵的每个格子作为模版的左上角即可。然后再和原模版矩阵对比

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <cstdio>
#include <cstring>

const int N = 54;
char s[N][N], t[N][N];
int n, m;

bool solve() {
    scanf("%d %d", &n, &m);

    for (int i = 0; i < n; ++i)
        scanf("%s", s[i]);

    for (int i = 0; i < m; ++i)
        scanf("%s", t[i]);

    for (int x = 0; x + m - 1 < n; ++x) {
        for (int y = 0; y + m - 1 < n; ++y) {
            bool ok = true;
            for (int i = 0; i < m && ok; ++i) {
                for (int j = 0; j < m && ok; ++j) {
                    if (s[x + i][y + j] != t[i][j]) {
                        ok = false;
                    }
                }
            }
            if (ok) {
                return true;
            }
        }
    }
    return false;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        puts(solve() ? "Yes" : "No");
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    static final int N = 54;
    static char[][] s = new char[N][N];
    static char[][] t = new char[N][N];

    public static boolean solve() {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        for (int i = 0; i < n; i++)
            s[i] = scanner.next().toCharArray();

        for (int i = 0; i < m; i++)
            t[i] = scanner.next().toCharArray();

        for (int x = 0; x + m - 1 < n; x++) {
            for (int y = 0; y + m - 1 < n; y++) {
                boolean ok = true;
                for (int i = 0; i < m && ok; i++) {
                    for (int j = 0; j < m && ok; j++) {
                        if (s[x + i][y + j] != t[i][j]) {
                            ok = false;
                        }
                    }
                }
                if (ok) {
                    return true;
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        while (T-- > 0) {
            System.out.println(solve() ? "Yes" : "No");
        }
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def solve():
    n, m = map(int, input().split())
    s = [input() for _ in range(n)]
    t = [input() for _ in range(m)]

    for x in range(n - m + 1):
        for y in range(n - m + 1):
            ok = True
            for i in range(m):
                for j in range(m):
                    if s[x + i][y + j] != t[i][j]:
                        ok = False
                        break
                if not ok:
                    break
            if ok:
                return True
    return False

T = int(input())
for _ in range(T):
    print("Yes" if solve() else "No")

第二题

题目:SXF序数

一个N位的正整数,如果把它的各个数位重新排列,则可以得到一些新的N位正整数。如果原数在所有的新数中是第k大的 (降序排序的第k个)则称原数的SXF序数为K。例如,一个4位数7225,把它的各个数位重新排列,得到的新的4位数中,最大的是7522,第二大的是7252,第三大的就是原

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务