安全破坏算法的解决方案

时间:2018-07-28 15:07:50

标签: algorithm

我试图找到更好的算法,并搜索了互联网,但找不到一个。 问题就解决了-

  

Satish具有一个组合保险柜,该保险柜由多个彼此相邻放置的旋转拨盘组成。每个拨盘上依次刻有数字0到9。在任何阶段,每个拨盘上的确切数字都是可见的。通过串联每个刻度盘的可见数字而形成的字符串称为当前组合。可以通过向上或向下旋转拨盘来更改拨盘上的可见数字。旋转拨入将数字增加1,即0到1、1到2,依此类推。拨盘上的数字环绕,因此9后面跟0。向下旋转拨盘会反向改变数字。

我们可以同时旋转多个相邻的转盘。也就是说,只需一步,我们就可以取任意数量的连续转盘,并沿相同方向将它们全部旋转一步。

Satish已获得当前的组合(C)和解锁保险箱的所需组合(R)。编写程序以确定打开保险箱所需的最少步骤。

输入: 986#007 输出: 2

//注意-这两个键之间用#

分隔

1 个答案:

答案 0 :(得分:0)

如果我没有误解这个问题,那么我有一个非常简单的解决方案。如果您选择仅通过一侧旋转来求解,则最小步数应为键中数字之间的最大向上旋转,而对于向下旋转则相同。否则,您可以选择上下旋转:对于每个特定的数字,应选择较少的步进旋转;并且总步数应该是最大向上旋转和最大向下旋转的总和。

    int maxDown = 0;
    for (int i = 0; i < keyLength; i++) {
      maxDown = max((10+key1[i]-key2[i])%10, maxDown);
    }

    int maxUp = 0;
    for (int i = 0; i < keyLength; i++) {
      maxUp = max((10+key2[i]-key1[i])%10, maxUp);
    }

    int maxUp2 = 0;
    int maxDown2 = 0;
    for (int i = 0; i < keyLength; i++) {
       int up = (10+key2[i]-key1[i])%10;
       int down = (10+key1[i]-key2[i])%10;
       if (up < down) {
           maxUp2 = max(up, maxUp2);
       }
       else {
           maxDown2 = max(down, maxDown2);
       }
    }
    int ans = min(maxUp, maxDown, maxUp2+maxDown2);

    return ans;

如果我错了,请告诉我一个例外情况。