我试图找到更好的算法,并搜索了互联网,但找不到一个。 问题就解决了-
Satish具有一个组合保险柜,该保险柜由多个彼此相邻放置的旋转拨盘组成。每个拨盘上依次刻有数字0到9。在任何阶段,每个拨盘上的确切数字都是可见的。通过串联每个刻度盘的可见数字而形成的字符串称为当前组合。可以通过向上或向下旋转拨盘来更改拨盘上的可见数字。旋转拨入将数字增加1,即0到1、1到2,依此类推。拨盘上的数字环绕,因此9后面跟0。向下旋转拨盘会反向改变数字。
我们可以同时旋转多个相邻的转盘。也就是说,只需一步,我们就可以取任意数量的连续转盘,并沿相同方向将它们全部旋转一步。
Satish已获得当前的组合(C)和解锁保险箱的所需组合(R)。编写程序以确定打开保险箱所需的最少步骤。
输入: 986#007 输出: 2
//注意-这两个键之间用#
分隔答案 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;
如果我错了,请告诉我一个例外情况。