华为上机真题 2022找到它
Posted Linux猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题 2022找到它相关的知识,希望对你有一定的参考价值。
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系我删除!
一、题目描述
找到它是个小游戏,你需要在一个矩阵中找到给定的单词,假设给定单词 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找到它的主要内容,如果未能解决你的问题,请参考以下文章