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秋招各大笔试题汇总,c++,java,python多种语言分析,解答。