Heng_Xin 题解分享 · 2024/4/11
剪邮票(结果填空) - 题解
枚举可能的 5个位置 (使用next_permutation 生成全排列), 然后使用 dfs判断是否是唯一的连通块 ```C++ #include <iostream> #include <vector> #include <algorithm> #include <utility> #include <functional> using namespace std; const int fx[4][2] = { {0, 1}, {0, -1}, {1, 0}, {-1, 0} }; int main() { int pl[12] = {1,1,1,1,1}; vector<vector<char>> arr(3, vector<char>(4)); sort(pl, pl + 12); int ok = 0, res = 0; function<void(int, int)> dfs = [&](int y, int x) { for (auto& it : fx) { int dy = y + it[0], dx = x + it[1]; if (dy < 0 || dy >= 3 || dx < 0 || dx >= 4 || arr[dy][dx] > 0) { continue; } arr[dy][dx] = 1; ++ok; dfs(dy, dx); } }; function<bool()> fun = [&]() { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { arr[i][j] = i * 4 + j + 1; if (pl[i * 4 + j]) { arr[i][j] = -arr[i][j]; } } } for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { if (pl[i * 4 + j]) { ok = 0; dfs(i, j); return ok == 5; } } } return false; }; do { if (fun()) ++res; } while (next_permutation(pl, pl + 12)); cout << res; return 0; } ```
查看全文
0 0 2 1