【问题标题】:Broken Calculator坏了的计算器
【发布时间】:2017-04-05 07:20:38
【问题描述】:

问题陈述:

有一个坏了的计算器。只有少数数字 [0 to 9] 和运算符 [+, -, *, /] 有效。

一个请求号。需要使用工作数字和运算符形成。键盘上的每一次按下都称为一次操作。

  • = 运算符始终在工作,并且在请求编号时使用。是使用运算符形成的。
  • -1 需要打印以防请求号。无法使用数字组成,并且提供的运算符 OR 超过最大数量。允许的操作。
  • 在计算结果的任何时间点,没有。应该变成负数或超过 999 [0 <= calcno <= 999]

输入:

  • 第一行包含 3 个空格分隔的编号:没有。工作数字,没有。工作操作员,最大。不允许任何操作。
  • 第二行包含空格分隔的工作数字。
  • 第三行包含空格分隔的工作运算符[1代表+2代表-3代表*4代表/]。
  • 第 4 行包含请求。不成立。

输出:

找到最少需要个操作来形成req no。


例子:

输入 1:

2 1 8  
2 5  
3  
50 

可能的方式:

案例 1: 2*5*5 = -> 6 operations
案例 2: 2*25 = -> 4 operations

4 是请求答案


输入 2:

3 4 8  
5 4 2  
3 2 4 1  
42  

可能的方式:
案例一:42 -> 2 operations(直接输入)
案例 2:5*4*2+2 = -> 8 operations
..........其他一些方法

2 是请求答案


我没有找到解决这个问题的正确方法。
有人可以提出一些解决问题的方法吗?

【问题讨论】:

  • 使用 BFS 解决问题。
  • 到目前为止,您对如何解决这个问题有任何具体的想法(除了“也许我可以使用 DP 或递归”)?如果提问者没有明显地尝试解决问题,有些人可能会犹豫提供帮助。
  • 运算是否有优先级,或者我们可以假设评估是从左到右进行的,即1+2*3 = 3*3 = 9
  • "2*25= -> 4 次操作" 如果每次按下按钮都是一次操作,那不应该是 5 次操作吗?
  • @Chris 你是对的。操作数为 5 。对于那个很抱歉。我将在问题陈述中更新相同的内容

标签: algorithm recursion dynamic-programming memoization


【解决方案1】:

给出 vish4071 在 cmets 中所说的更多上下文。

按以下方式设置图表: 以根开始图表,然后新节点是您大声使用的数字(例如,这是 2 和 5)。并逐层构建图。 按照以下方式制作每个级别,一个新节点将由添加数字或您大声使用的运算符组成。在每个运算符之后不能有另一个运算符。

如果节点的值高于目标值,则杀死节点(目标作为尾注),这仅适用于本示例(如果运算符是 * 和 +)。如果您能够使用 - 和 / 运算符,那么这不是有效的。

这样做直到找到所需的值,并且级别(+1,由于 = 操作)就是您的答案。

下面给出了图表的例子

for your first example:
D=0    D=1    
       5
      /
Root /
     \
      \2


D=1    D=2   d=3   d=4
            --2
           / 
          /
        (*)___5  --> reaches answer but at level 6
        /   
       /     (*)___2  --> complete
      /     /   \  5
     /     /
  2 /____25_252    --> end node
    \     \
     \     \ 
      \     
       \    225    --> end node
        \  /
         22__222   --> end node
           \            
            (*)

这比暴力破解稍微好一点,也许有更优化的方法。

【讨论】:

  • 由于 OP 只要求some ways to approach the problem,我认为这个答案就足够了。但是你错过了很多关于实现的细节,而且有一些事情是不正确的,比如如果节点的值高于目标,你就杀死节点,这不会对 [2]、[+、/]、[3 给出正确的答案],这可以通过2+2+2/2 来实现。 PS:我自己没有写答案,因为它工作太多;P
  • @vish4071 你是对的,我会在几秒钟内编辑我的答案。我还错过了什么?我有一些空闲时间:)
  • 缺少一些实现细节,例如您始终可以使用大小为 1000 的哈希表来检查访问节点,最初可以从给定数字创建所有可能的 1,2 和 3 位数字并保持跟踪操作的数量。虽然作为指导,但正如我在之前的评论中所说的那样,这个答案已经足够好了 :)
  • 建议创建一个非二叉树,然后在每个级别计算所需值的值。如果找到所需的值,则返回步数。我不知道应该是什么情况下知道无法形成所需的值并且输出为-1
  • @ShashankShekhar 问题描述中给出了最大操作量。对于 thuis 示例,深度为 7 将是最大值......使用 thuis 来结束您的计算。干杯
【解决方案2】:
    #include <bits/stdc++.h>
using namespace std;

int main() {
    // your code goes here
    int n,m,o;
    cin>>n>>m>>o;
    int arr[n];
    queue<pair<int,int>> q;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
        q.push(make_pair(arr[i],1));
    }
    int op[m];
    for(int i=0;i<m;i++) cin>>op[i];
    unordered_map<int,int> mp;
    for(int i=0;i<m;i++) mp[op[i]]=1;
    int target;
    cin>>target;
    int ans=INT_MAX;
    while(!q.empty())
    {
        int num=q.front().first;
        int count=q.front().second;
        if(num==target) ans=min(ans,count);
        q.pop();
        for(int i=0;i<=4;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==0 and count+1<=o)
                {
                    q.push(make_pair(num*10+arr[j],count+1));
                }
                else
                {
                    if(i==1 and mp.find(i)!=mp.end() and count+3<=o)
                    {
                        q.push(make_pair(num+arr[j],count+3));
                    }
                    if(i==2 and mp.find(i)!=mp.end() and count+3<=o)
                    {
                        q.push(make_pair(abs(num-arr[j]),count+3));
                    }
                    if(i==3 and mp.find(i)!=mp.end() and count+3<=o)
                    {
                        q.push(make_pair(num*arr[j],count+3));
                    }
                    if(i==4 and mp.find(i)!=mp.end() and count+3<=o)
                    {
                        q.push(make_pair(num/arr[j],count+3));
                    }
                }
            }
        }
    }
    if(ans==INT_MAX) cout<<"-1"<<endl;
    else cout<<ans<<endl;
    
    return 0;
}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2014-02-25
  • 2018-12-11
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多