白駿2138電球とスイッチ(Java、Java)


今回解決した問題.
白駿2138号電球とスイッチ.
📕 質問リンク
❗¥コード
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static int N;
    static boolean [][] map;
    static boolean [] dest;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        String tmp = br.readLine();
        map = new boolean[2][N];
        dest = new boolean[N];
        for(int i = 0; i < N; ++i)
        {
            boolean b = tmp.charAt(i) == '1';
            map[0][i] = b;
            map[1][i] = b;
        }
        tmp = br.readLine();
        for(int i = 0; i < N; ++i) dest[i] = tmp.charAt(i) == '1';

        for(int i = 0; i < 2; ++i) map[0][i] = !map[0][i]; // 0 1 누름

        int answer = Integer.MAX_VALUE;
        int cnt = 1;
        for(int t = 0; t < 2; ++t)
        {
            for(int i = 1; i < N-1; ++i)
            {
                if(map[t][i-1] != dest[i-1])
                {
                    press(t,i);
                    cnt++;
                }
            }
            if(map[t][N-2] != dest[N-2])
            {
                map[t][N-2] = !map[t][N-2];
                map[t][N-1] = !map[t][N-1];
                cnt++;
            }
            if(map[t][N-1] == dest[N-1]) answer = Math.min(answer,cnt);
            cnt = 0;
        }
        if(answer == Integer.MAX_VALUE) answer = -1;
        System.out.print(answer);
    }
    static void press(int idx, int num)
    {
        for(int i = num-1; i < num+2; ++i) map[idx][i] = !map[idx][i];
    }
}
📝 に答える
N個の電球とN個のスイッチが並んでいる場合、Nを押すとN−1、N、N+1の電球を開閉することができます.
これは、入力された電球が所定の状態になるように、押下可能なスイッチ回数の最大値を求めるという問題である.不可能な場合は-1を出力します.
まず、2つの場合に1つ目のスイッチを押すかどうかを確認できます.
理由を説明すると、まず、各電球の状態に影響を与えるインデックスは、あなた自身と以前のインデックスです.(N−1,N)従って、1番スイッチから順次ナビゲーションを開始する際に、N−1番電球の状態を比較することにより、N番スイッチが押下されたか否かを判断し、結果に順次アクセスすることができる.上記の方法を適用するには、0番のインデックスから決定して開始する必要があります.そのため、1番のスイッチ(インデックスが0)と0以外の2つの方法でナビゲートすることで、この問題を解決できます.
実行プロセスは難しくないので、省略します.
📜 ポスト
これは容易に実施できるが、解決しにくい問題である.
googlingでいくつかのアイデアを得ましたが、次回似たような問題が発生したら、簡単に解決できるはずです!^^