【华为OD机试 】 单词搜索(C++ Java JavaScript Python)

2023-10-27

题目描述

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

假设给定单词 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”。

用例

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

题目解析

79. 单词搜索

C++

#include <iostream>
#include <cstring>
using namespace std;

const int N = 105;
string g[N];
string w;
int n, m;
bool st[N][N];

bool dfs(int x, int y, int k)
{
    if (g[x][y] != w[k]) return false; // 当前字符不匹配

    if (k == w.size() - 1) return true; // 找到了最后一个字符

    st[x][y] = true; // 标记当前点已经走过

    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    for (int i = 0; i < 4; i ++ )
    {
        int a = x + dx[i], b = y + dy[i];
        if (a >= 0 && a < n && b >= 0 && b < m && !st[a][b])
            if (dfs(a, b, k + 1)) return true; // 向四个方向继续搜索
    }

    st[x][y] = false; // 回溯

    return false;
}

int main()
{
    cin >> n >> m >> w;

    for (int i = 0; i < n; i ++ ) cin >> g[i];

    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ )
            if (dfs(i, j, 0))
            {
                cout << i + 1 << ' ' << j + 1 << endl;
                return 0;
            }

  cout << "NO" << endl;
 

    return 0;
}

java

import java.util.Scanner;

public class Main {
    static String[] g = new String[105];
    static String w;
    static int n, m;
    static boolean[][] st = new boolean[105][105];

    public static boolean dfs(int x, int y, int k) {
        if (g[x].charAt(y) != w.charAt(k)) return false;
        if (k == w.length() - 1) return true;

        st[x][y] = true;

        int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
        for (int i = 0; i < 4; i++) {
            int a = x + dx[i], b = y + dy[i];
            if (a >= 0 && a < n && b >= 0 && b < m && !st[a][b]) {
                if (dfs(a, b, k + 1)) return true;
            }
        }

        st[x][y] = false;

        return false;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        w = sc.next();

        for (int i = 0; i < n; i++) {
            g[i] = sc.next();
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (dfs(i, j, 0)) {
                    System.out.println((i + 1) + " " + (j + 1));
                    return;
                }
            }
        }

        System.out.println("NO");
    }
}

javaScript

const readline = require("readline");
 
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
 
const lines = [];
let n, m;
let word;
rl.on("line", (line) => {
  lines.push(line);
 
  if (lines.length === 2) {
    [n, m] = lines[0].split(" ").map(Number);
    word = lines[1];
  }
 
  if (n && lines.length === n + 2) {
    const matrix = lines.slice(2).map((line) => line.split(""));
    console.log(dfs(matrix, n, m, word));
 
    lines.length = 0;
  }
});
 
function dfs(matrix, n, m, word) {
  const len = word.length;
  const visited = new Array(n).fill(0).map(() => new Array(m).fill(false));
 
  const backTracking = (i, j, k) => {
    if (k === len) return true;
 
    if (
      i < 0 ||
      i >= n ||
      j < 0 ||
      j >= m ||
      visited[i][j] ||
      matrix[i][j] !== word[k]
    )
      return false;
 
    visited[i][j] = true;
 
    const nextK = k + 1;
    const res =
      backTracking(i - 1, j, nextK) ||
      backTracking(i + 1, j, nextK) ||
      backTracking(i, j - 1, nextK) ||
      backTracking(i, j + 1, nextK);
 
    visited[i][j] = false;
    return res;
  }
 
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      if (backTracking(i, j, 0)) {
        return `${i + 1} ${j + 1}`;
      }
    }
  }
 
  return "NO";
}

python

n, m = map(int, input().split())
w = input()
g = []
for i in range(n):
    g.append(input())

st = [[False] * m for _ in range(n)]

def dfs(x, y, k):
    if g[x][y] != w[k]:
        return False
    
    if k == len(w) - 1:
        return True
    
    st[x][y] = True
    
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    for i in range(4):
        a = x + dx[i]
        b = y + dy[i]
        if a >= 0 and a < n and b >= 0 and b < m and not st[a][b]:
            if dfs(a, b, k + 1):
                return True
    
    st[x][y] = False
    
    return False

for i in range(n):
    for j in range(m):
        if dfs(i, j, 0):
            print(i + 1, j + 1)
            exit()

print("NO")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【华为OD机试 】 单词搜索(C++ Java JavaScript Python) 的相关文章

随机推荐

  • win10设置关机计划

    方法一 推荐 1 win r键打开运行窗口 cmd进入命令行 2 输入关机命令 修改时间完毕后 粘贴进入命令行 schtasks create tn shut tr shutdown s f sc once st 20 00 sd 2021
  • Tomcat服务器下载安装及配置教程(IDEA中使用Tomcat)

    目录 友情提醒 第一章 Tomcat下载与安装 1 1 Tomcat介绍 1 2 官网下载 第二章 Tomcat配置环境变量 2 1 windows环境变量配置 2 2 验证Tomcat配置是否成功 2 3 报错解决 第三章 IDEA整合T
  • 投影问题:带号求解,及中央子午线计算

    2 WGS 1984 坐标系的墨卡托投影分度带 UTM ZONE 选择方法如下 1 北半球地区 选择最后字母为 N 的带 2 可根据公式计算 带数 经度整数位 6 的整数部分 31 给一个实用公式吧 6度的 n int L 6 1 中央子午
  • javascript 防抖节流

    Javascript防抖和节流的深入理解和实践 http www ptbird cn javascript anti shake throttle html https www cnblogs com momo798 p 9177767 h
  • @RequestMapping用法详解

    这个相当于servlet的请求配置
  • [LeetCode-88]-Merge Sorted Array(有序数组合并)

    文章目录 0 题目相关 1 Solution 2 其他改进方案 0 题目相关 题目解读 给定两个有序数组 对数组进行合并操作 要求合并后的数组依旧有序 原题描述 原题链接 Given two sorted integer arrays nu
  • 【第39篇】RepLKNet将内核扩展到 31x31:重新审视 CNN 中的大型内核设计

    文章目录 摘要 一 简介 二 相关工作 2 1 大内核模型 2 2 模型缩放技术 2 3 结构重新参数化 三 应用大卷积的指南 四 RepLKNet 大内核架构 4 1 架构规范 4 2 使大内核更大 4 3 ImageNet 分类 4 5
  • python,pycharm 的环境变量设置

    官网下载安装python解释器时 如果忘记勾选添加到环境变量 add to path 可进行如下操作 来添加 更改环境变量 1 右键单击桌面上的 此计算机 图标 然后选择 属性 2 打开系统窗口并单击左侧的 高级系统设置 3 单击系统属性底
  • 如何让网页自适应所有屏幕宽度

    随着网络的快熟发展 越来越多的人使用手机上网 移动设备正超过桌面设备 成为访问互联网的最常见终端 于是 网页设计师不得不面对一个难题 如何才能在不同大小的设备上呈现同样的网页 手机的屏幕比较小 宽度通常在600像素以下 PC的屏幕宽度 一般
  • Markdown 文本居中、字体颜色以及数学公式

    文章目录 文本格式 文字居中 字体 字体颜色 字体大小 背景色 颜色 数学公式 希腊字母 行内与独行 上标 下标与组合 汉字 字体与格式 占位符 定界符与组合 四则运算 高级运算 逻辑运算 集合运算 数学符号 文本格式 文字居中 1 文字居
  • 数据结构---求最大公约数

    求最大公约数 穷举法 辗转相除法法 第一步 第二步 第三步 JAVA实现 更相减损术 第一步 第二步 第三步 JAVA实现 更相减损术与移位相结合 操作逻辑 例子 JAVA实现 写一段代码 求出两个整数的最大公约数 要尽量优化算法的性能 例
  • Python 处理错误和异常

    微信公众号 数据分析与统计学习如有问题或建议 请公众号留言最近更新时间 2018 7 2 一 前言 Python的系列文章主要介绍python语言的基础语法知识 按照核心内建数据类型 语句 函数 类 异常 标准模块的顺序对相关的语法知识进行
  • imx6ull开发板,usb免驱摄像头的配置

    在 dev下面 只能找到video0 说明开发板并没有识别出有新连接进来的摄像头 需要在内核中 配置支持UVC标准的USB驱动 重新配置即可
  • cve 爬虫_爬虫CNVD构建漏洞库

    import requests from lxml import etree import xlsxwriter from requests utils import add dict to cookiejar import execjs
  • 关于电路交换、报文交换和分组交换

    交换 所谓交换 指的就是服务器与服务器之间的数据交换 考纲要求掌握三种 电路交换 报文交换和分组交换 这篇文章主要介绍这三种交换方式 以及分组交换中的数据报和虚电路 电路交换 电路交换即在通信之前 在通信双方之间建立一条被双方独占的物理通路
  • obsidian加git备份,同时忽略掉自己不想同步的文件夹

    最近想用这个语雀进行知识库的分享 但是这个语雀的会员费太贵了 思来想去还是用 git 比较好 因为这个知识库的内容都是自己的笔记 为了能够访问的更加方便我选择了这个 gitte 而不是 github 我的知识库链接 knowledge 第一
  • 如何在sqlplus执行sql文件

    1 Oracle数据库的sqlplus可以直接执行SQL语句吗 2 SQL Plus中怎么执行多个 sql脚本文件 3 如何在sqlplus执行sql文件 4 怎样在sqlplus中批量执行sql文件 Oracle数据库的sqlplus可以
  • 在模仿中精进数据分析与可视化01——颗粒物浓度时空变化趋势(Mann–Kendall Test)

    本文是在模仿中精进数据分析与可视化系列的第一期 颗粒物浓度时空变化趋势 Mann Kendall Test 主要目的是参考其他作品模仿学习进而提高数据分析与可视化的能力 如果有问题和建议 欢迎在评论区指出 若有其他想要看的作品 也欢迎在评论
  • GIT合并分支的三种方法

    一 使用merge命令合并分支 1 目标 将dev分支合并到master分支 1 1 首先切换到master分支上 git checkout master 1 2 如果是多人开发的话 需要把远程master上的代码pull下来 git pu
  • 【华为OD机试 】 单词搜索(C++ Java JavaScript Python)

    题目描述 找到它是一个小游戏 你需要在一个矩阵中找到给定的单词 假设给定单词 HELLOWORD 在矩阵中只要能找到 H gt E gt L gt L gt O gt W gt O gt R gt L gt D连成的单词 就算通过 注意区分