版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/88561413
问题描述:
有n个圆环相邻,其中每一个圆环上都是0-9的数字,每个圆环都可按照0-9转动,也可以按照9-0的方向转动
现在需要手动转动这个圆环,开启密码,问最少需要转动圆环多少次
现在输入三组值:
第一行:n 表示圆环的个数
第二行:长度为n的圆环当前状态码
第三行: 长度为n的圆环开锁密码状态码
例一(表示一共有3个圆环,当前圆环状态码为123,圆环开启密码状态码321)
3
123
321
输出为 4
例二(表示一共有4个圆环,当前圆环状态码为0792,圆环开启密码状态码9470)
4
0792
9470
输出为 8
分析:因为圆环可以正向旋转从0-9,也可以反方向旋转9-0,所以圆环上从一个状态码到另外一个状态码最远的距离就是5
不会超过5,比如从0状态到9状态,只需要逆序旋转一次即可,所以在对当前状态码进行和密码状态码旋转的时候,分开进行每个圆环对应的状态进行比较,只要相应的值之差的绝对值超过5就用10-绝对值,就是真正最少旋转的值了。
比如上面的例子从0792状态到9470状态,第一个环从0到9需要逆序转1次,第二个环需要逆向方向转3次,第三个环需要逆向转2次
第四个环从2到0需要逆序转2次,最终就是 1+3+2+2=8次
/**
* @ Author zhangsf
* @CreateTime 2019/3/14 - 8:40 PM
*/
package com.bjut.practice;
import java.util.Scanner;
public class Loop {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//sum作为统计最终的最少的操作次数
int sum=0;
//第一个数表示输入的圆环的个数
int n = sc.nextInt();
String currentString="";
String rightString="";
//完成输入的准备工作
for(int i = 0; i < 2*n; i++){
if(i<n){
//前n个输入放入到currentString中
currentString=currentString+sc.nextInt();
}else{
rightString=rightString+sc.nextInt();
}
}
//将输入的两个String类型转为char 数组
char[] current =currentString.toCharArray();
char[] right=rightString.toCharArray();
//遍历current和right数组取出对应的位置
//a和b进行比较,如果|a-b|>5就用10-|a-b|,最后累加起来,作为最小的操作次数
for(int i=0;i<right.length;i++){
//分别取到两个数组中的各个元素
int a = Integer.valueOf(current[i]).intValue();
int b = Integer.valueOf(right[i]).intValue();
//两个数之间的举例
int gab= Math.abs(a-b);
if(gab>5){
gab=10-gab;
}
sum+=gab;
}
for(int j=0;j<n;j++){
}
System.out.println("圆环的个数:"+n);
System.out.println("输入的圆环当前转态码:"+currentString);
System.out.println("输入的圆环解锁的态码:"+rightString);
System.out.println("最小的移动次数:"+sum);
}
}