社区讨论

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 条回复,欢迎继续交流。

正在加载回复...