社区讨论
61pts求助
B4299[蓝桥杯青少年组国赛 2022] 路线参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhpi0fwo
- 此快照首次捕获于
- 2025/11/08 07:40 3 个月前
- 此快照最后确认于
- 2025/11/08 07:40 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
int m, n;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
int total;
map<long long, long long> dp[15][15];
bool isValid(int x, int y) {
return x >= 0 && x < m && y >= 0 && y < n;
}
int getId(int x, int y) {
return x * n + y;
}
bool canReach(int sx, int sy, long long visited) {
if (__builtin_popcountll(visited) == total) return true;
long long unvisited = ((1LL << total) - 1) ^ visited;
long long reach = 0;
queue<pair<int, int>> q;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int id = getId(i, j);
if (!(visited & (1LL << id))) {
q.push({i, j});
reach |= (1LL << id);
goto bfs_start;
}
}
}
bfs_start:
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (isValid(nx, ny)) {
int id = getId(nx, ny);
if (!(visited & (1LL << id)) && !(reach & (1LL << id))) {
reach |= (1LL << id);
q.push({nx, ny});
}
}
}
}
return (reach & unvisited) == unvisited;
}
long long dfs(int x, int y, long long visited) {
if (__builtin_popcountll(visited) == total) {
if ((abs(x - 0) + abs(y - 0)) == 1) return 1;
return 0;
}
if (dp[x][y].count(visited)) return dp[x][y][visited];
if (!canReach(x, y, visited)) return dp[x][y][visited] = 0;
long long res = 0;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (isValid(nx, ny)) {
int id = getId(nx, ny);
if (!(visited & (1LL << id))) {
res += dfs(nx, ny, visited | (1LL << id));
}
}
}
return dp[x][y][visited] = res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> m >> n;
total = m * n;
if (total % 2 == 1) {
cout << 0 << endl;
return 0;
}
cout << dfs(0, 0, 1LL) << endl;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...