华为OD机试 -单词搜索、矩阵中找到给定的单词(C++ Java JavaScript Python)

这篇博客主要介绍了华为OD机考中的一道题目,即在矩阵中寻找给定单词的算法问题。解题思路包括使用深度优先搜索(DFS),在允许上下左右移动的矩阵中判断字母路径是否与给定单词一致。博客提供了C++、Java、JavaScript和Python的解题代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。

假设给定单词 HELLOWORD,在矩阵中只要能找到 H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。

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

输入描述

输入第 1 行包含两个整数 n、m (0 < n,m < 21) 分别表示 n 行 m 列的矩阵,

第 2 行是长度不超过100的单词 W (在整个矩阵中给定单词 W 只会出现一次),

从第 3 行到第 n+2 行是指包含大小写英文字母的长度为 m 的字符串矩阵。

输出描述

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

否则输出“NO”。

ACM输入输出模式

如果你经常使用Leetcode,会知道letcode是不需要编写输入输出函数的。但是华为OD机考使用的是 ACM 模式,需要手动编写输入和输出。

所以最好在牛-客上提前熟悉这种模式。例如C++使用cin/cout,python使用input()/print()。JavaScript使用node的readline()console.log()。Java 使用sacnner/system.out.print()

用例

输入 5 5
HELLOWORLD
CPUCY
EKLQH
CHELL
LROWO
DGRBC
输出 3 2
说明
输入 5 5
HELLOWORLD
CPUCY
EKLQH
CHELL
LROWO
AGRBC
输出 NO
说明

题目解析

原题:

矩阵稀疏扫描是指对于一个二维矩阵,按照行优先的顺序扫描矩阵中的元素,并将非零元素按照行优先的顺序存储到一个一维数组中。 以下是一个使用Java语言实现的矩阵稀疏扫描的示例代码: ```java public class MatrixSparseScan { public static int[] sparseScan(int[][] matrix) { int row = matrix.length; // 矩阵的行数 int col = matrix[0].length; // 矩阵的列数 // 计算非零元素的个数 int count = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (matrix[i][j] != 0) { count++; } } } // 创建稀疏数组 int[] sparseArray = new int[count * 3 + 1]; sparseArray[0] = row; // 存储矩阵的行数 sparseArray[1] = col; // 存储矩阵的列数 sparseArray[2] = count; // 存储非零元素的个数 int index = 3; // 稀疏数组的索引 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (matrix[i][j] != 0) { sparseArray[index++] = i; // 存储非零元素的行索引 sparseArray[index++] = j; // 存储非零元素的列索引 sparseArray[index++] = matrix[i][j]; // 存储非零元素的值 } } } return sparseArray; } public static void main(String[] args) { int[][] matrix = { {1, 0, 0}, {0, 2, 0}, {0, 0, 3} }; int[] sparseArray = sparseScan(matrix); for (int i = 0; i < sparseArray.length; i++) { System.out.print(sparseArray[i] + " "); } } } ``` 运行上述代码,输出结果为:3 3 3 0 0 1 1 1 2 2 2 3。其中,3表示矩阵的行数,3表示矩阵的列数,3表示非零元素的个数,接下来依次为非零元素的行索引、列索引和值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值