[BOJ] 전구와 스위치
Date:
[BOJ] 전구와 스위치
Problem URL : 전구와 스위치
#include <iostream>
#include <string>
#include <algorithm>
#define INF 987654321
using namespace std;
int N, answer;
bool current[100000], goal[100000];
void push(int idx) {
if (idx > 0) {
current[idx - 1] = !current[idx - 1];
}
current[idx] = !current[idx];
if (idx < N - 1) {
current[idx + 1] = !current[idx + 1];
}
}
void dfs(int idx, int cnt){
if (cnt >= answer) {
return;
}
if (idx == N){
bool flag = true;
for (int i = 0; i < N; i++) {
if (current[i] != goal[i]) {
flag = false;
break;
}
}
if (flag) answer = min(answer, cnt);
return;
}
//[1]
if (current[idx - 1] == goal[idx - 1]) dfs(idx + 1, cnt);
push(idx);
if (current[idx - 1] == goal[idx - 1]) dfs(idx + 1, cnt + 1);
push(idx);
}
int main(void){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
string init, end;
cin >> N >> init >> end;
for (int i = 0; i < N; i++) {
if (init[i] == '1') {
current[i] = true;
}
if (end[i] == '1') {
goal[i] = true;
}
}
answer = INF;
dfs(1, 0);
push(0);
dfs(1, 1);
if (answer == INF) {
cout << -1 << "\n";
} else {
cout << answer << "\n";
}
return 0;
}
Comments
[1] 한칸씩 오른쪽으로 이동하면서, 왼쪽의 전구들을 목표값이랑 같게 만들어주는게 핵심
댓글