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;
}


题目分析

这道题目主要考察 字符串匹配字典查找。给定了一些“模糊”的验证码图像,每个图像表示一个数字,图像中的 ? 可以被替换为任意数字。我们需要根据给定的图像模板,识别出图像所表示的数字。

题目类型

这道题目属于 字典查找 类的题目,涉及到如何将给定的图像与事先定义好的模板进行匹配。

解题思路

  1. 预定义模板
    • 题目中给出了 0-9 的数字的模板样式(模糊格式),其中 # 表示固定的字符,? 表示数字位置。我们可以将每个数字的模糊图像模板预先存储在一个字典中。
  2. 模板映射
    • 通过将图像转化为模糊的字符串(将数字替换为 ?,将 # 保持不变),然后与预定义的模板进行匹配,识别出对应的数字。
  3. 输入处理
    • 对于每个图像,依次读取其 5 行数据,并将其转化为对应的模糊字符串,使用预定义的模板字典来查找对应的数字。
  4. 输出结果
    • 将所有识别出的数字拼接起来,最终输出。

代码大致描述

  1. 预定义模板:用一个哈希表(unordered_map)存储每个数字对应的模糊字符串。
  2. 输入读取:读取多组图像数据,每组图像有 5 行 5 列,处理每行的字符,转换成模糊格式。
  3. 图像识别:将转换后的模糊字符串与字典中的模板进行匹配,找到对应的数字。
  4. 拼接答案:将识别出的所有数字拼接成最终的验证码结果。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#春招##面经##校招##C++##笔试#
C++笔试真题题解 文章被收录于专栏

笔试真题题解

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务