C++ 中的手机数字键盘问题2025 年 5 月 17 日 | 阅读 13 分钟 移动数字键盘问题是一个图遍历组合问题,其动机来源于手机数字键盘的约束(布局和移动)。因此,该问题在于在严格遵循邻近规则的情况下,可以形成指定长度为 n 的数字的唯一序列的数量。典型的手机数字键盘布局如下: 在此数字键盘布局中,我们将按键定义为图的节点,并将相邻的按键定义为共享水平、垂直或对角线边的按键。假设按键 5 与 2、4、6 和 8 相邻,而按键 0 仅与 8 相邻。形成序列时按键之间的有效转换由这些邻近关系决定。 问题在于找到可以定义的长度为 n 的序列的数量,使得从数字键盘上的任何数字开始,所有邻近约束都成立。如果 n=2,5 会产生有效的序列 52、54、56、58 等。可以使用大 O 符号来证明。随着 n 的增长,可能的序列数量呈指数级增长,因此问题变得更加困难。 该问题在各个领域都有实际应用,包括:
通过将数字键盘表示为图,其中节点代表每个按键,边连接相邻的按键,来解决移动数字键盘问题。最后,我们使用动态规划方法来解决这个问题。对于任何给定的序列长度 n,我们都可以有效地计算链接序列的数量。具体来说,状态定义为当前按键和序列长度,并且利用先前序列长度计算出的结果来构建更长的序列解决方案。 方法一:蛮力法(递归回溯)移动数字键盘问题首先通过蛮力法解决,即从数字键盘的每个数字开始,探索每个长度的序列。此方法将数字键盘表示为图,其中每个数字是一个节点,相邻按键之间的有效移动由边定义。该算法通过遍历此图,使用递归和回溯来生成所有可能的序列。 我们使用递归函数,该函数接收起始数字,移动到其有效的邻居,并在每一步减少序列长度。当长度变为 1 时,它会记录一个有效的序列。通过回溯,该算法保证涵盖所有可能的组合,因为当创建一个路径后,我们可以回溯并仅探索其他选项。 程序让我们通过一个使用蛮力法的 C++ 示例来说明移动数字键盘问题。 输出 This program calculates the total number of sequences of a specified length that can be formed on a mobile numeric keypad. The rules are as follows: 1. You can start from any digit on the keypad. 2. You can only move to adjacent keys (up, down, left, or right). 3. The keypad layout and movement constraints are modeled as a graph. 4. The result is the total number of valid sequences following these rules. Mobile Numeric Keypad Layout: 1 2 3 4 5 6 7 8 9 0 Enter the length of the sequences to generate: 2 Processing digit: 0 Neighbors of 0: 0 8 00 08 Completed processing for digit 0 Processing digit: 1 Neighbors of 1: 1 2 4 11 12 14 Completed processing for digit 1 Processing digit: 2 Neighbors of 2: 2 1 3 5 22 21 23 25 Completed processing for digit 2 Processing digit: 3 Neighbors of 3: 3 2 6 33 32 36 Completed processing for digit 3 Processing digit: 4 Neighbors of 4: 4 1 5 7 44 41 45 47 Completed processing for digit 4 Processing digit: 5 Neighbors of 5: 5 2 4 6 8 55 52 54 56 58 Completed processing for digit 5 Processing digit: 6 Neighbors of 6: 6 3 5 9 66 63 65 69 Completed processing for digit 6 Processing digit: 7 Neighbors of 7: 7 4 8 77 74 78 Completed processing for digit 7 Processing digit: 8 Neighbors of 8: 8 5 7 9 0 88 85 87 89 80 Completed processing for digit 8 Processing digit: 9 Neighbors of 9: 9 6 8 99 96 98 Completed processing for digit 9 Total number of sequences of length 2 is: 36 Program execution completed. Thank you! 说明数字键盘被视为一个图,包括数字节点和相邻按键之间的有效移动(边)。此方法使用递归和回溯来为给定图生成所有可能的数字序列。 关键组件
复杂度分析时间复杂度 上述蛮力法的时间复杂度可以根据从数字键盘上的每个数字开始的所有可能序列的递归探索来分析。
空间复杂度
方法二:广度优先搜索 (BFS) 方法广度优先搜索 (BFS) 是一种图遍历策略,它从起始节点(或数字键盘上的裸数字)开始,逐层遍历所有可能的路径并向外扩展。BFS 用于生成长度为 n 的有效序列,给定任何数字作为移动数字键盘问题的起始位置。每个数字(0-9)在图中表示为一个节点,数字之间的允许移动构成边。BFS 的特点是它应该按步骤(层)探索序列。每一步,每一层都比前一步多一个数字的序列。 程序让我们通过一个使用广度优先搜索 (BFS) 方法的 C++ 示例来说明移动数字键盘问题。 输出 Enter the length of the sequences (positive integer): 3 Keypad Layout: 1 2 3 4 5 6 7 8 9 0 Total number of sequences of length 3: 130 说明数字键盘表示 我们有一个无序映射(unordered_map<int, vector<int>>),键 -> 有效的邻居键(0-9)。例如: 按键 0 可以移动到 0 和 8。按键 1 可以访问 1、4、2。 结构 SequenceState:BFS 中的序列状态由结构 SequenceState 表示。它包含两个属性:
辅助函数
复杂度分析时间复杂度 移动数字键盘问题的广度优先搜索 (BFS) 方法的时间复杂度与 BFS 遍历生成的可能序列的数量有关。
空间复杂度 BFS 方法的空间复杂度主要在于队列中序列的存储,这直接与图中节点的数量有关。
|
在本文中,我们将讨论如何使用 const_iterator 在 C++ 中遍历 set。在深入研究其实现之前,我们必须了解 C++ 中的 set。什么是 set? C++ 中的标准模板库 (STL) 容器 std::set 显示了不同元素的排序集合...
5 分钟阅读
Strobogrammatic 数是指旋转 180 度后看起来相同的数字,因此它们倒置看起来也相同。例如,69、88 和 818 是 strobogrammatic 的,因为即使将它们翻转,它们看起来仍然相同。但是,如果我们取一个数字...
7 分钟阅读
引言:俄罗斯农夫乘法算法,也称为埃及乘法算法,是一种古老的乘法方法,它依赖于二等分和加倍,使其易于手动计算。它通过减少一系列更简单的步骤来分解乘法问题...
11 分钟阅读
本文将介绍 C++ std::midpoint 的语法和示例。概述 Std::midpoint 是对现有 C++20 标准语言的重大改进,它满足了程序员对高效中点计算的需求。所讨论的函数提供了一种可定制的技术来计算...
阅读 6 分钟
简介多态内存资源 (PMR) 是 C++17 标准库的一部分,旨在作为灵活的自由存储。因此,PMR 框架添加了一种以实践为中心的方法来通用处理自定义内存分配机制,从而允许提供...
阅读 10 分钟
引言 斐波那契数列是数学中最著名的数列之一。它出现在从计算机科学到自然的各个地方。传统上,斐波那契数是通过递归或动态规划计算的。然而,有一种相当优雅的数学方法可以直接计算第 n 个斐波那契数...
阅读 4 分钟
在本文中,我们将讨论 C++ 中 tellg 和 tellp 之间的区别。但在讨论它们的区别之前,我们必须了解 C++ 中的 tellg 和 tellp。什么是 tellg() 函数? tellg() 函数返回流中指针的当前“获取”位置。它...
5 分钟阅读
指数搜索是一种针对已排序数组的强大算法。它的效率来自于指数增长和二分查找技术的战略组合。该算法首先以指数增长的索引扫描数组,直到找到目标值的可能位置...
阅读 10 分钟
矩阵指数化介绍 矩阵指数化是提高求矩阵幂运算效率的一种数学技术。它不是通过重复的直接矩阵乘法来完成,而是利用数学性质,在 log(n) 时间内完成计算,效率极高……
阅读 8 分钟
CSV 文件格式,即“逗号分隔值”,通常用于存储和交换已使用的表格数据。CSV 文件中的数据以纯文本形式组织成行和列。CSV 文件由组织成行和列的纯文本数据组成。每行代表一个...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India