题解分享
题解分享简介
剪邮票(结果填空) - 题解
枚举可能的 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



