T2.小红的验证码 - 饿了么
题目描述
小红是一个程序员,他正在开发一个验证码功能。为了正确识别机器人和真实用户,小红需要对验证码进行特殊处理。
他想出来了如下加密法:
图像+数字识别法,在一张5x5图片中放入一个数字,例如:
#222#
#2###
#232#
###2#
#272#
这张图片机器人会识别数字 22222322272,但是正确的识别码为 5。
给出所有的数字摆放形态:
["#???#","#?#?#","#?#?#","#?#?#","#???#"]
["##?##","##?##","##?##","##?##","##?##"]
["#???#","###?#","#???#","#?###","#???#"]
["#???#","###?#","#???#","###?#","#???#"]
["#?#?#","#?#?#","#???#","###?#","###?#"]
["#???#","#?###","#???#","###?#","#???#"]
["#???#","#?###","#???#","#?#?#","#???#"]
["#???#","###?#","###?#","###?#","###?#"]
["#???#","#?#?#","#???#","#?#?#","#???#"]
["#???#","#?#?#","#???#","###?#","#???#"]
系统将会在?处随机填入[0,9]的数字,然后给出m个图片,为 pitcurei(1<=i<=m),你需要按照1~m的顺序输出这 m 个数字以正确识别小红的系统。
输入描述
第一行一个整数 m(1<m<1000),表示图片个数。
接下来共 m*5行,每行5列,表示给定的图片。输入保证仅含 [0,9] 和 #。
输出描述
一个整数,表示图片所所表示的正确验证码。
示例1
输入:
1
#222#
#2###
#232#
###2#
#272#
输出:
5
示例2
输入:
2
#222#
#2###
#232#
###2#
#272#
##1##
##1##
##1##
##1##
##1##
输出:
51
C++
#include <bits/stdc++.h>
using namespace std;
// 验证码模板映射关系
unordered_map<string, string> mp{
{"#???##?#?##?#?##?#?##???#", "0"},
{"##?####?####?####?####?##", "1"},
{"#???####?##???##?####???#", "2"},
{"#???####?##???####?##???#", "3"},
{"#?#?##?#?##???####?####?#", "4"},
{"#???##?####???####?##???#", "5"},
{"#???##?####???##?#?##???#", "6"},
{"#???####?####?####?####?#", "7"},
{"#???##?#?##???##?#?##???#", "8"},
{"#???##?#?##???####?##???#", "9"},
};
int main() {
int m;
cin >> m;
string ans;
for (int i = 0; i < m; i++) {
string code, tmp;
for (int j = 0; j < 5; j++) {
cin >> tmp;
for (char ch: tmp) {
// 转成原始的模板格式(既将数字转成?)
code.push_back((ch == '#' ? '#' : '?'));
}
ans += mp[code];
}
}
cout << ans << endl;
return 0;
}
题目分析
这道题目主要考察 字符串匹配 和 字典查找。给定了一些“模糊”的验证码图像,每个图像表示一个数字,图像中的
?
可以被替换为任意数字。我们需要根据给定的图像模板,识别出图像所表示的数字。题目类型
这道题目属于 字典查找 类的题目,涉及到如何将给定的图像与事先定义好的模板进行匹配。
解题思路
- 预定义模板:
- 题目中给出了 0-9 的数字的模板样式(模糊格式),其中
#
表示固定的字符,?
表示数字位置。我们可以将每个数字的模糊图像模板预先存储在一个字典中。- 模板映射:
- 通过将图像转化为模糊的字符串(将数字替换为
?
,将#
保持不变),然后与预定义的模板进行匹配,识别出对应的数字。- 输入处理:
- 对于每个图像,依次读取其 5 行数据,并将其转化为对应的模糊字符串,使用预定义的模板字典来查找对应的数字。
- 输出结果:
- 将所有识别出的数字拼接起来,最终输出。
代码大致描述
- 预定义模板:用一个哈希表(
unordered_map
)存储每个数字对应的模糊字符串。- 输入读取:读取多组图像数据,每组图像有 5 行 5 列,处理每行的字符,转换成模糊格式。
- 图像识别:将转换后的模糊字符串与字典中的模板进行匹配,找到对应的数字。
- 拼接答案:将识别出的所有数字拼接成最终的验证码结果。
#春招##面经##校招##C++##笔试#整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
C++笔试真题题解 文章被收录于专栏
笔试真题题解