首页 > 试题广场 >

开锁

[编程题]开锁
  • 热度指数:463 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小明是一位宝石收藏家,他搜集了非常多的名贵宝石,并且把它们保存在一个保险箱当中,这个保险箱有100层保险,前99层都是魔法封印,最后一层却是相当朴素的锁。这个锁由n个圆环顺序排列而成,每个圆环上都从小到大顺序雕刻着0到9这10个数字。每一次操作,小明可以向前旋转一个圆环的一位数字,或者向后旋转一个圆环的一位数字。数字变化的顺序是0到9再到0,也可以是9到0再到9。给出开锁的密码和当前密码锁的状态,问最少需要多少次操作可以开锁?

输入描述:
第一行一个数字n,表示圆环的个数;

第二行一个字符串,长度为n,表示圆环当前的状态;

第三行一个字符串,长度为n,表示开锁的密码。

满足1 <= n <= 1000。


输出描述:
最少的操作次数。
示例1

输入

3
123
321

输出

4
示例2

输入

4
0792
9470

输出

8
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        int time=0;//次数
        int lockNumIndex=0;
        int pwdIndex=0;
        Scanner s = new Scanner(System.in);
        int lock = Integer.parseInt(s.next());
        String lockNumSum = s.next();
        String pwdSum = s.next();
        for(int i=0;i<lock;i++){
            lockNumIndex= (int) (lockNumSum.charAt(lock-i-1));
            pwdIndex = (int) pwdSum.charAt(lock-i-1);
            if(lockNumIndex!=pwdIndex){
                int interval = Math.abs(lockNumIndex - pwdIndex);
                if(interval<=5){
                    time = time + interval;
                }else{
                    time = time + (10 - interval);
                }
            }
        }
        System.out.print(time);
    }
}
发表于 2021-08-02 19:22:10 回复(0)
#include <iostream>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <set>
#include <queue>
#include <algorithm>

using namespace std;

int n;
char str[1500];
int source[1500];
int target[1500];

int main() {
    std::ios::sync_with_stdio(false);
    cin >> n;
    cin >> (str + 1);
    for (int i = 1; i <= n; i++) {
        source[i] = str[i] - '0';
    }

    cin >> (str + 1);
    for (int i = 1; i <= n; i++) {
        target[i] = str[i] - '0';
    }

    int sum = 0;
    for (int i = 1; i <= n; i++) {
        int moveLeft, moveRight;
        if (source[i] <= target[i]) {
            moveLeft = target[i] - source[i]; // source[i]向右
            moveRight = (source[i] - 0 + 1) + 9 - target[i]; //source[i]向左
        }

        if (source[i] > target[i]) {
            moveRight = source[i] - target[i]; // source[i]向左
            moveLeft = (9 - source[i] + 1) + target[i] - 0; // source[i]向右
        }

        sum += min(moveLeft, moveRight);
    }
    cout << sum;

    return 0;
}

发表于 2023-11-27 22:06:36 回复(0)
public class Main {
    public static void main(String[] args) {
        int time=0;//次数
        String lockNumIndex="0";
        String pwdIndex="0";
        
        int qwe = 0;
        char[] chars = lockNumIndex.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            //第一种结果
            int q = Integer.parseInt(String.valueOf(chars[i])) + 10;
            int w = Integer.parseInt(String.valueOf(pwdIndex.charAt(i)));
            int abs = Math.abs(q - w);
            int i1 = abs % 10;
            //第二种结果
            int q1 = Integer.parseInt(String.valueOf(chars[i]));
            int w1 = Integer.parseInt(String.valueOf(pwdIndex.charAt(i))) + 10;
            int abs1 = Math.abs(w1 - q1);
            int i2 = abs1 % 10;
            //返回结果
            int i3 = i1 <= i2 ? i1 : i2;
            qwe += i3;
        }

         System.out.println(qwe);



    }
    
}
不给我过啥意思
发表于 2022-04-17 14:29:12 回复(0)
<?
public function method($n,$status,$pwd)
    {
        $num= 0;
        if ($n != strlen($status) || $n != strlen($pwd))  return -1;
        for($i= 0; $i< $n; $i++) {
            $abs= abs($pwd{$i} - $status{$i});
            if($abs<= 5) {
                $num+= $abs;
            } else{
                $num+= (10 - $abs);
            }
        }
      return $num;
    }
编辑于 2021-12-19 16:55:04 回复(0)