some programs!!
This commit is contained in:
1 parent
ed054247d5
commit
71f1022dea
38 files changed
+1037
-281
No files matched your search
@@ -0,0 +1,86 @@
|
||||
#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;
|
||||
}
|
||||
Reference in new issue
Block a user