Files
exercises/cs101/dh_20260909_16_swap_bits.cpp
T
2026-09-25 20:20:01 +08:00

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;
}