特殊密碼鎖

題目

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

發佈了126 篇原創文章 · 獲贊 76 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章