0
Follow
0
View

Magic Operation: Stone movement game

anhui_my 注册会员
2023-02-28 21:05

#include 
#include 
#include 
#include 

using namespace std;

const int MAXN = 5;
const int MAXM = 5;
const int MAXS = 6;
const int MAXD = 100;
const int MAXS2 = MAXS * MAXS * MAXS * MAXS * MAXS * MAXS;
double dp[2][MAXS2 + 10];

int n, m, d;
vector<int> a, b;

int get_idx(const vector<int>& v) {
    int res = 0;
    for (int i = 0; i < v.size(); i++) {
        res = res * MAXS + v[i];
    }
    return res;
}

vector<int> get_vec(int idx, int size) {
    vector<int> res;
    while (size--) {
        res.push_back(idx % MAXS);
        idx /= MAXS;
    }
    return res;
}

int main() {
    cin >> n >> m >> d;

    a.resize(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    b.resize(m);
    for (int i = 0; i < m; i++) {
        cin >> b[i];
    }

    memset(dp, 0, sizeof(dp));
    int cur = 0, nxt = 1;
    dp[cur][get_idx(b)] = 1.0;

    for (int t = 0; t < d; t++) {
        memset(dp[nxt], 0, sizeof(dp[nxt]));

        for (int i = 0; i < MAXS; i++) {  // 选择哪一堆石子
            vector<int> tmpa = a;
            if (tmpa[i] > 0) {
                tmpa[i]--;
                for (int j = 0; j < MAXS; j++) {
                    vector<int> tmpb = b;
                    if (tmpb[j] > 0) {
                        tmpb[j]--;
                        int nxt_idx = get_idx(tmpb);
                        dp[nxt][nxt_idx] += dp[cur][get_idx(tmpa)] / (n * m);
                    }
                }
            }
        }

        cur ^= 1;
        nxt ^= 1;
    }

    double ans = 0.0;
    for (int i = 0; i < MAXS2; i++) {
        vector<int> tmpb = get_vec(i, m);
        bool flag = true;
        for (int j = 0; j < m; j++) {
            if (tmpb[j] > 0) {
                flag = false;
                break;
            }
        }
        if (flag) {
            ans += dp[cur][i];
        }
    }

    cout << fixed << setprecision(4) << ans << endl;

    return 0;
}

.
< !- - - - - >