題目
描述
有一種特殊的二進制密碼鎖,由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 發佈!