华为上机真题 2022找到它

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题 2022找到它相关的知识,希望对你有一定的参考价值。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

二、解题思路

三、代码实现

四、时间复杂度


注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系我删除!

一、题目描述

找到它是个小游戏,你需要在一个矩阵中找到给定的单词,假设给定单词 HELLOWORLD,在矩阵中只要能找到 H->E->L->L->O->W->O->R->L->D 连成的单词,就算通过。

注意:区分英文字母大小写,并且你只能上下左右行走,不能走回头路。

1.1 输入描述

输入第一行包含两个整数 n、m (0 < n, m< 21),分别表示 n 行 m 列的矩阵,第二行时长度不超过 100 的单词 W(在整个矩阵中给定单词只会出现一次),从第三行到到第 n+2 行时只包含大小写英文字母的长度为 m 的字符串矩阵。

1.2 输出描述

如果能在矩阵中连成给定的单词,则输出给定单词首字母在矩阵中的位置(第几行 第几列),否则输出 “NO”。

1.3 测试样例

1.3.1 示例 1

输入

5 5
HELLOWORLD
CPUCY
EKLQH
CHELL
LROWO
DGRBC

输出

3 2

1.3.2 示例 2

输入

Helloworld
CPUCh
wolle
orldO
EKLQo
PGRBC

输出

NO

说明:区分大小写

二、解题思路

本题是一道简单的深度优先搜索题目,根据输入的字符串使用深度优先搜索算法遍历给定的二维数组。

依次判断二维数组中的每一个元素,判断是否与字符串的第一个元素相等,如果相等则采用深度优先搜索算法在二维数组中遍历给定的字符串,找到字符串则记录第一个元素的坐标,否则,如果遍历完二维数组都没有找到,输出 NO。

三、代码实现

代码实现如下所示。

#include <iostream>
#include <vector>
#include <string.h>
using namespace std;

const int MAX = 100;
int n, m;
bool vis[MAX][MAX];
int dx[] = 1, -1, 0, 0;
int dy[] = 0, 0, -1, 1;
bool dfs(int x, int y, vector<string>g, string str, int idx)

    if (idx + 1 == (int)str.size()) 
        return true;
    
    idx++;
    for (int i = 0; i < 4; ++i) 
        int sx = dx[i] + x;
        int sy = dy[i] + y;
        if (sx < n && sy < m && sx >= 0 && sy >= 0) 
            if (str[idx] == g[sx][sy] && !vis[sx][sy]) 
                vis[sx][sy] = true;
                if(dfs(sx, sy, g, str, idx)) 
                    return true;
                
                vis[sx][sy] = false;
            
        
    
    return false;


int main()

    string str;
    while (cin>>n>>m) 
        cin>>str;
        vector<string>g;
        string tmpStr;
        for (int i = 0; i < n; ++i) 
            cin>>tmpStr;
            g.push_back(tmpStr);
        

        bool flag = false;
        int x = 0, y = 0;
        for (int i = 0; i < n && !flag; ++i) 
            for (int j = 0; j < m && !flag; ++j) 
                if (str[0] == g[i][j]) 
                    memset(vis, false, sizeof(vis));
                    flag = dfs(i, j, g, str, 0);
                    x = i;
                    y = j;
                
            
        

        if (flag) cout<<x+1<<" "<<y+1<<endl;
        else cout<<"NO"<<endl;
    
    return 0;

在上述代码中,最后输出 x 和 y 的时候需要给坐标值加 1。

四、时间复杂度

时间复杂度:O(n^2*m^2)

在上述代码中,两层 for 循环的时间复杂度为 O(n*m),每循环一次需要深度搜索一次(当然,实际上只有满足与给定字符串第一个元素相等才进行),深度搜索一次最坏时间复杂度为O(nm),所以总的时间复杂度为O(n^2*m^2),当然这里实际的时间复杂度比这里计算的要低。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


以上是关于华为上机真题 2022找到它的主要内容,如果未能解决你的问题,请参考以下文章

华为上机真题 2022玩牌高手

华为上机真题 2022数组组成的最小数字

华为上机真题 2022流水线

华为上机真题 2022太阳能板的最大面积

华为上机真题 2022路灯照明

华为上机真题 2022猴子爬山