Java 如何找到拨号板问题的解决方案?
这不是一个家庭作业问题,也不是要求完整的代码。 问题的开头是- 您可以使用带有拨号板和计算器应用程序的旧触摸式智能手机号码 目标:目标是在拨号板上键入一个数字。但由于手机很旧,一些号码和一些操作无法触摸。例如,2、3、5、9键没有响应,即您不能使用它们,但您始终可以使用计算器中的其他数字和操作生成数字。可以有多种方法来生成数字。计算器有1-9和+,-,*,/,=作为运算。一旦你在计算器中做了这个数字,你就可以复制这个数字并使用它。您必须找到获得数字所需的最小接触次数 我尝试了回溯和其他一些来源来寻找解决这个问题的可能方法 输入: 将有多个测试用例。每个测试用例将由4行组成Java 如何找到拨号板问题的解决方案?,java,algorithm,data-structures,Java,Algorithm,Data Structures,这不是一个家庭作业问题,也不是要求完整的代码。 问题的开头是- 您可以使用带有拨号板和计算器应用程序的旧触摸式智能手机号码 目标:目标是在拨号板上键入一个数字。但由于手机很旧,一些号码和一些操作无法触摸。例如,2、3、5、9键没有响应,即您不能使用它们,但您始终可以使用计算器中的其他数字和操作生成数字。可以有多种方法来生成数字。计算器有1-9和+,-,*,/,=作为运算。一旦你在计算器中做了这个数字,你就可以复制这个数字并使用它。您必须找到获得数字所需的最小接触次数 我尝试了回溯和其他一些来源来
- N:拨号板中工作的键数(0,1,2,3,4,5,6,7,8,9中的一个)
- M:支持的操作类型(+、-、*、/)
- O:允许的最大接触次数
怎么会是4?1+4=,“=”也算作触摸。这是一个动态编程问题,可以用字典解决。它需要以下数据结构:
操作
:一种字典映射键,可将其按到匿名函数,以确定其对状态的作用。请注意,数字也是复杂的运算,例如,应用于当前状态2
的1
将为您提供状态21
to_state
:将状态映射到到达该状态的最快路径的字典。其中一个路径是一个类似Lisp的列表,包含[最后一个操作,[…,[第二个操作,[第一个操作,无]]].]
,因此示例的路径是['=',['4',['+',['1',无]]
即将到来的
:可以从已知状态到达的[状态,路径]
队列。它以['',无]
开始target\u state
:我们想要结束的状态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])