华为机考真题 -- 特殊的加密算法

题目描述:

有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。

规则如下:
1. 明文为一段数字串由 0~9 组成
2. 密码本为数字 0~9 组成的二维数组
3.需要按明文数字串串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是由相邻的单元格数字组成,上下和左右是相邻的,注意:对角线不相邻,同一个单元格的数字不能重复使用。
4. 每一位明文对应密文即为密码本中找到的单元格所在的行和列序号(序号从0开始)组成的两个数宇。 如明文第 i 位 Data[i] 对应密码本单元格为 Book[x][y],则明文第 i 位对应的密文为X Y,X和Y之间用空格隔开。

如果有多条密文,返回字符序最小的密文。

如果密码本无法匹配,返回"error"。

请你设计这个加密程序。

示例1:

密码本:
0 0 2
1 3 4
6 6 4

明文:"3",密文:"1 1"

示例2:

密码本:
0 0 2
1 3 4
6 6 4

明文:"0 3",密文:"0 1 1 1"

示例3:

密码本:
0 0 2 4
1 3 4 6
3 4 1 5
6 6 6 5
明文:"0 0 2 4",密文:"0 0 0 1 0 2 0 3" 和 "0 0 0 1 0 2 1 2",返回字典序最小的"0 0 0 1 0 2 0 3"
明文:"8 2 2 3",密文:"error",密码本中无法匹配

C++ 源码:

#include <iostream>
#include <vector>
#include <string>
#include <utility>

using namespace std;

bool dfs(int u, int v, int k, vector<vector<int>>& Book, vector<vector<bool>>& vist, vector<pair<int, int>>& ans, const vector<int>& Data) {
    vist[u][v] = true;
    ans.push_back({ u, v });

    if (k == Data.size() - 1) {
        return true;
    }

    int dx[] = { -1, 0, 0, 1 };
    int dy[] = { 0, -1, 1, 0 };

    for (int i = 0; i < 4; ++i) {
        int x = u + dx[i];
        int y = v + dy[i];

        if (0 <= x && x < Book.size() && 0 <= y && y < Book.size() && !vist[x][y] && Book[x][y] == Data[k + 1]) {
            if (dfs(x, y, k + 1, Book, vist, ans, Data)) {
                return true;
            }
        }
    }

    ans.pop_back();
    vist[u][v] = false;
    return false;
}

int main() {
    const int N = 100;
    int n;
    cin >> n;
    vector<int> Data(n);
    for (int& num : Data) cin >> num;
    int m;
    cin >> m;
    vector<vector<int>> Book(m, vector<int>(m));
    for (vector<int>& row : Book) {
        for (int& num : row) cin >> num;
    }

    vector<vector<bool>> vist(N, vector<bool>(N, false));
    vector<pair<int, int>> ans;

    bool find = false;
    for (int i = 0; i < m && !find; ++i) {
        for (int j = 0; j < m; ++j) {
            if (Data[0] == Book[i][j]) {
                if (dfs(i, j, 0, Book, vist, ans, Data)) {
                    find = true;
                    break;
                }
            }
        }
    }

    if (!find || ans.empty()) {
        cout << "error" << endl;
    }
    else {
        for (const auto& p : ans) {
            cout << p.first << " " << p.second << " ";
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

华为OD机考真题是指华为公司在招聘过程中所使用的在线机考试题目。这些题目旨在评估应聘者的技术能力、逻辑思维以及解决问题的能力。以下是对华为OD机考真题解读的简要说明。 华为OD机考真题的内容丰富多样,主要涵盖计算机科学、网络技术、算法设计、数据结构等多个领域。对于应聘者来说,这些题目不仅要求具备扎实的专业知识,还要求能够将知识应用于实际场景中,并能够灵活运用、创新思考。 在解答华为OD机考真题时,应聘者需要具备良好的解题思路和方法。首先,应聘者需要仔细阅读题目,理解题意和要求,明确问题的关键点。其次,应聘者需要运用所学知识和技能分析问题,并制定解决方案。此时,良好的逻辑思维和分析能力是十分重要的。最后,应聘者需要将解决方案转化为具体的代码实现或解题步骤,并进行测试和验证。 华为OD机考真题的目的是为了筛选出具备优秀技术能力和解决问题能力的人才。在解题过程中,华为注重考察应聘者的创新能力和解决问题的能力,不仅关注结果,还关注解决问题的思路和方法。因此,应聘者在回答真题时除了要给出正确的答案,还需要展现出对问题的全面思考和独立思考的能力。 总之,华为OD机考真题的解答需要应聘者具备扎实的专业知识、良好的解题思路、逻辑思维能力和解决问题的能力。这些真题旨在筛选出具备创新思维和解决问题能力的优秀人才。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值