我如何找到解决拨号盘问题的方法?

时间:2019-05-10 17:10:23

标签: java algorithm data-structures

P.S这不是一个作业问题,也不要求完整的代码。 问题始于-

为您提供了带有触摸板和计算器应用程序的老式触摸智能手机号码。

目标:目标是在拨号盘上键入数字。但是随着电话的陈旧,一些号码和某些操作无法被触及。例如。 2,3,5,9键没有响应,即您无法使用它们,但是您始终可以使用计算器中的其他数字和运算来生成数字。可以有多种方式进行数字编号。计算器具有1-9和+,-,*,/,=作为运算符。在计算器中创建号码后,您可以复制并使用该号码。您必须找到获得号码所需的最少接触次数。

我尝试了回溯和其他几种方式来解决此类问题。

输入:

会有多个测试用例。每个测试用例将由4行组成

  1. 第一行将包含N,M,O

    • N:在Dialpad中可用的键数(0、1、2、3、4、5、6、7、8、9中不存在)
    • M:支持的操作类型(+,-,*,/)
    • O:最多不能触摸
  2. 第二行输入包含有效的数字,例如0,2,3,4,6。

  3. 第三行包含值描述操作1(+),2(-),3(*),4(/)
  4. 第四行包含我们要输入的号码。

输出:

输出包含1行打印数字所需的触摸次数

示例测试用例:

1 // No of test cases
5 3 5 // N ,M, O
1 2 4 6 0 // digits that are working (total number of digits = N),
1 2 3 // describing operations allowed (1–> ‘+’, 2–> ‘-‘, 3–> ‘*’ , 4–> ‘/’ )(total number is equals to M)
5 // number we want to make

答案3 怎么4? 1 + 4 =,“ =”也算作触摸。

1 个答案:

答案 0 :(得分:0)

这是一个动态编程问题,可以使用字典来解决。它需要以下数据结构:

  1. operation:一个字典映射键,可以按此键来使用匿名功能来确定其对状态的作用。请注意,数字也是复杂的运算,例如,将1应用于当前状态2会为您提供状态21
  2. to_state:字典将状态映射到到达该状态的最快路径。路径是[last_operation, [..., [second_operation, [first_operation, None]]...]的类似Lisp的列表,因此示例的路径将是['=', ['4', ['+', ['1', None]]]]
  3. upcoming:可以从已知状态到达的[state, path]队列。它以['', None]开始。
  4. target_state:我们要进入的状态。

Python代码的核心是这样:

while (True):
    state, path = upcoming.shift()
    if state in to_state:
        pass # We have a better route here.
    else:
        to_state[state] = path
        for op, func in operation.iteritems():
            next_state = func(state)
            next_path = [op, path]
            if next_state == 'error':
                pass # Don't need this.
            elif next_state == target_state:
                return next_path
            else:
                upcoming.push([next_state, next_path])

我不是用Java编程的,但是它具有lambda形式的匿名函数,Maps形式的字典以及队列的几种实现,包括LinkedList。因此,翻译此代码应该相对简单。

当然,您必须编写所有函数,编写输入代码以阅读难题,然后将路径以所需的形式转换为答案。因此,还有很多工作要做。