#include #include #include #include struct cell { int i, j, k, l; cell(int i, int j, int k, int l) : i(i), j(j), k(k), l(l) {} }; int main() { const int n = 16; const double p = 0.20; const int source_i = 0, source_j = 0, source_k = 0, source_l = 0; const int target_i = n - 1, target_j = n - 1, target_k = n - 1, target_l = n - 1; std::mt19937 gen(time(0)); for (int64_t attempt_i = 1;; ++attempt_i) { if (attempt_i % 1000 == 0) { std::cout << "\rattempt " << attempt_i, std::cout.flush(); } bool a[n][n][n][n] = {}; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int k = 0; k < n; ++k) { for (int l = 0; l < n; ++l) { a[i][j][k][l] = gen() % 1000000 > p * 1e6; // whether wall is present } } } } a[source_i][source_j][source_k][source_l] = false; // source is not a wall a[target_i][target_j][target_k][target_l] = false; // destination is not a wall // BFS std::queue q; q.push({source_i, source_j, source_k, source_l}); bool used[n][n][n][n] = {}; while (!q.empty()) { const auto [i, j, k, l] = q.front(); q.pop(); if (used[i][j][k][l]) { continue; } used[i][j][k][l] = true; if (i > 0 && !a[i - 1][j][k][l] && !used[i - 1][j][k][l]) { q.push({i - 1, j, k, l}); } if (i < n - 1 && !a[i + 1][j][k][l] && !used[i + 1][j][k][l]) { q.push({i + 1, j, k, l}); } if (j > 0 && !a[i][j - 1][k][l] && !used[i][j - 1][k][l]) { q.push({i, j - 1, k, l}); } if (j < n - 1 && !a[i][j + 1][k][l] && !used[i][j + 1][k][l]) { q.push({i, j + 1, k, l}); } if (k > 0 && !a[i][j][k - 1][l] && !used[i][j][k - 1][l]) { q.push({i, j, k - 1, l}); } if (k < n - 1 && !a[i][j][k + 1][l] && !used[i][j][k + 1][l]) { q.push({i, j, k + 1, l}); } if (l > 0 && !a[i][j][k][l - 1] && !used[i][j][k][l - 1]) { q.push({i, j, k, l - 1}); } if (l < n - 1 && !a[i][j][k][l + 1] && !used[i][j][k][l + 1]) { q.push({i, j, k, l + 1}); } } if (used[target_i][target_j][target_k][target_l]) { std::cout << "\rattempt " << attempt_i << " succeeded:" << std::endl; /*for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int k = 0; k < n; ++k) { for (int l = 0; l < n; ++l) { std::cout << (i == source_i && j == source_j && k == source_k && l == source_l ? "SS" : i == target_i && j == target_j && k == target_k && l == target_l ? "TT" : used[i][j][k][l] ? "" : "[]"); } std::cout << " "; } std::cout << "\n\n"; } std::cout << "\n"; }*/ for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int k = 0; k < n; ++k) { for (int l = 0; l < n; ++l) { if (!used[i][j][k][l]) { continue; } std::cout << i * 4 - 0.5 << " " << j * 4 - 0.5 << " " << k * 4 - 0.5 << " " << l * 4 - 0.5 << "\n"; std::cout << i * 4 + 3.5 << " " << j * 4 + 3.5 << " " << k * 4 + 3.5 << " " << l * 4 + 3.5 << "\n"; std::cout << (i > 0 && used[i - 1][j][k][l] ? "" : "x") << (i < n - 1 && used[i + 1][j][k][l] ? "" : "X"); std::cout << (j > 0 && used[i][j - 1][k][l] ? "" : "y") << (j < n - 1 && used[i][j + 1][k][l] ? "" : "Y"); std::cout << (k > 0 && used[i][j][k - 1][l] ? "" : "z") << (k < n - 1 && used[i][j][k + 1][l] ? "" : "Z"); std::cout << (l > 0 && used[i][j][k][l - 1] ? "" : "w") << (l < n - 1 && used[i][j][k][l + 1] ? "" : "W") << "\n"; } } } } std::cout << (n - 1) * 4 << " " << (n - 1) * 4 << " " << (n - 1) * 4 << " " << (n - 1) * 4 << "\n"; std::cout << (n - 1) * 4 + 2 << " " << (n - 1) * 4 + 2 << " " << (n - 1) * 4 + 2 << " " << (n - 1) * 4 + 2 << "\n"; std::cout << "T" << std::endl; return 0; } } }