题目
描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011
000
样例输出
1
解答
public class Test
public static void main(String[] args) {
String concurrent = "011";
String spec = "000";
two(concurrent, spec);
}
public static void two(String concurrent, String spec) {
Assert.assertTrue("Cannot be greater than 30", concurrent.length() <= 30);
String[] one = toArray(concurrent);
String[] two = toArray(spec);
if (one.length != two.length) {
System.out.println("impossible");
return;
}
Integer[] concurrentInts = toIntegers(one);
Integer[] specInts = toIntegers(two);
Integer count = 0;
for (int i = 0; i < concurrentInts.length - 1; i++) {
// 最后
if (i == concurrentInts.length - 2) {
if (concurrentInts[i] != specInts[i]) {
count++;
concurrentInts[concurrentInts.length - 2] = swap(concurrentInts[concurrentInts.length - 2]);
concurrentInts[concurrentInts.length - 1] = swap(concurrentInts[concurrentInts.length - 1]);
}
}
// 第一个位置和中间位置
if (concurrentInts[i] != specInts[i]) {
count++;
concurrentInts[i] = swap(concurrentInts[i + 1]);
concurrentInts[i+1] = swap(concurrentInts[i + 1]);
concurrentInts[i+2] = swap(concurrentInts[i + 2]);
}
}
if (Arrays.toString(concurrentInts).equals(Arrays.toString(specInts))) {
System.out.println(count);
} else {
System.out.println("impossible");
}
}
public static Integer[] toIntegers(String[] strs) {
Integer[] num = new Integer[strs.length];
for (int i = 0; i < num.length; i++) {
num[i] = Integer.parseInt(strs[i]);
}
return num;
}
public static Integer swap(Integer num) {
if (num == 0) {
num = 1;
}
if (num == 1) {
num = 0;
}
return num;
}
public static String[] toArray(String str) {
return str.split("");
}
}
> 本文由博客一文多发平台 OpenWrite 发布!