Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到拨号板问题的解决方案?_Java_Algorithm_Data Structures - Fatal编程技术网

Java 如何找到拨号板问题的解决方案?

Java 如何找到拨号板问题的解决方案?,java,algorithm,data-structures,Java,Algorithm,Data Structures,这不是一个家庭作业问题,也不是要求完整的代码。 问题的开头是- 您可以使用带有拨号板和计算器应用程序的旧触摸式智能手机号码 目标:目标是在拨号板上键入一个数字。但由于手机很旧,一些号码和一些操作无法触摸。例如,2、3、5、9键没有响应,即您不能使用它们,但您始终可以使用计算器中的其他数字和操作生成数字。可以有多种方法来生成数字。计算器有1-9和+,-,*,/,=作为运算。一旦你在计算器中做了这个数字,你就可以复制这个数字并使用它。您必须找到获得数字所需的最小接触次数 我尝试了回溯和其他一些来源来

这不是一个家庭作业问题,也不是要求完整的代码。 问题的开头是-

您可以使用带有拨号板和计算器应用程序的旧触摸式智能手机号码

目标:目标是在拨号板上键入一个数字。但由于手机很旧,一些号码和一些操作无法触摸。例如,2、3、5、9键没有响应,即您不能使用它们,但您始终可以使用计算器中的其他数字和操作生成数字。可以有多种方法来生成数字。计算器有1-9和+,-,*,/,=作为运算。一旦你在计算器中做了这个数字,你就可以复制这个数字并使用它。您必须找到获得数字所需的最小接触次数

我尝试了回溯和其他一些来源来寻找解决这个问题的可能方法

输入: 将有多个测试用例。每个测试用例将由4行组成

  • 第一行由N、M、O组成

    • N:拨号板中工作的键数(0,1,2,3,4,5,6,7,8,9中的一个)
    • M:支持的操作类型(+、-、*、/)
    • O:允许的最大接触次数
  • 第二行输入包含正在工作的数字,例如0、2、3、4、6

  • 第三行包含描述操作的值,1(+),2(-),3(*),4(/)
  • 第四行包含我们要生成的数字
  • 输出: 输出包含一行打印制作数字所需的触摸次数

    样本测试用例: 答复3
    怎么会是4?1+4=,“=”也算作触摸。

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

  • 操作
    :一种字典映射键,可将其按到匿名函数,以确定其对状态的作用。请注意,数字也是复杂的运算,例如,应用于当前状态
    2
    1
    将为您提供状态
    21
  • to_state
    :将状态映射到到达该状态的最快路径的字典。其中一个路径是一个类似Lisp的列表,包含
    [最后一个操作,[…,[第二个操作,[第一个操作,无]]].]
    ,因此示例的路径是
    ['=',['4',['+',['1',无]]
  • 即将到来的
    :可以从已知状态到达的
    [状态,路径]
    队列。它以
    ['',无]
    开始
  • target\u 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形式的匿名函数、映射形式的字典以及包括LinkedList在内的多个队列实现


    当然,然后你必须编写所有函数,编写输入代码来阅读谜题,然后将路径转换回你想要的答案。因此还有很多工作要做。

    这就是为什么回溯不适用于你?使用回溯无法在给定约束下获得可能的解决方案。这个问题没有很好地解决完全没有定义。计算器是否理解*和/绑定强于+和-?复制以前生成的数字算作一次触摸还是两次触摸(复制+粘贴)或者其他什么?例如,我们可以通过键入42复制粘贴来构建424242吗?如果我键入1+2+5,中间结果3是否显示并且可以复制?是否是整数除法?我们只能复制数字的一部分吗?问题太多了……我想你没有正确阅读它。拨号盘的输入受限,而且输入的每个字符都有限t被认为是触摸。
    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])