87 lines
2.6 KiB
C++
87 lines
2.6 KiB
C++
#include <cstring>
|
|
#include <iostream>
|
|
|
|
constexpr size_t MAX_N = 201;
|
|
int n, evaluation_value, original_evaluation_value;
|
|
bool bits[MAX_N], original_bits[MAX_N], target_bits[MAX_N];
|
|
|
|
std::ostream& print_bits(const bool* bits_list = bits, std::ostream& os = std::clog) {
|
|
for (int i = 0; i < n; i++) {
|
|
os << (bits_list[i] ? 1 : 0);
|
|
}
|
|
return os;
|
|
}
|
|
|
|
void swap_bits(int i, int j) {
|
|
if (bits[i] != target_bits[i]) { evaluation_value--; }
|
|
if (bits[j] != target_bits[j]) { evaluation_value--; }
|
|
std::swap(bits[i], bits[j]);
|
|
if (bits[i] != target_bits[i]) { evaluation_value++; }
|
|
if (bits[j] != target_bits[j]) { evaluation_value++; }
|
|
}
|
|
|
|
int evaluate() {
|
|
if (evaluation_value == 1) { return 1; }
|
|
return evaluation_value / 2;
|
|
}
|
|
|
|
bool dfs(int last_swap_pos = 0, int depth = 0, int target_depth = 0) {
|
|
const int h = evaluate();
|
|
if (h == 0) { return true; }
|
|
if (depth + h > target_depth) {
|
|
return false;
|
|
}
|
|
std::clog << "DEPTH=" << depth << "\th=" << h << "\t";
|
|
print_bits() << "\t";
|
|
print_bits(target_bits) << std::endl;
|
|
for (int i = 0; i < n - 1; i++) {
|
|
if (bits[i] == bits[i + 1]) { continue; }
|
|
if (i == last_swap_pos) { continue; }
|
|
if (bits[i] == target_bits[i] && bits[i + 1] == target_bits[i + 1]) { continue; }
|
|
if ((bits[i] == target_bits[i] || bits[i + 1] == target_bits[i + 1]) &&
|
|
(bits[i + 1] != target_bits[i] && bits[i] != target_bits[i + 1])) { continue; }
|
|
swap_bits(bits[i], bits[i + 1]);
|
|
if (dfs(i, depth + 1, target_depth)) { return true; }
|
|
swap_bits(bits[i], bits[i + 1]);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int ida_star() {
|
|
for (int target_depth = evaluate(); target_depth <= 2 * n; target_depth++) {
|
|
memcpy(bits, original_bits, n);
|
|
evaluation_value = original_evaluation_value;
|
|
std::clog << "target_depth:" << target_depth << std::endl;
|
|
if (dfs(-1, 0, target_depth)) {
|
|
return target_depth;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
bool init_evaluate() {
|
|
int original_sum = 0, target_sum = 0;
|
|
for (int i = 0; i < n; i++) {
|
|
original_sum += original_bits[i];
|
|
target_sum += target_bits[i];
|
|
original_evaluation_value += original_bits[i] != target_bits[i];
|
|
}
|
|
return original_sum == target_sum;
|
|
}
|
|
|
|
int main() {
|
|
std::ios::sync_with_stdio(false);
|
|
std::cin.tie(nullptr);
|
|
|
|
std::cin >> n;
|
|
for (int i = 0; i < n; i++) { std::cin >> original_bits[i]; }
|
|
for (int i = 0; i < n; i++) { std::cin >> target_bits[i]; }
|
|
if (!init_evaluate()) {
|
|
std::cout << -1 << std::endl;
|
|
return 0;
|
|
}
|
|
std::cout << ida_star() << std::endl;
|
|
|
|
return 0;
|
|
}
|