这个题,读懂题意以后就是暴力的时间,可惜最后半小时,我没来得及调完bug,赛后才过的。

题目大意
给一个3*3的方格填入 1-9 九个数
有些数是已知的,有些数是对方已知但我未知的,有些数是大家都未知的
我要计算取得最大的对应值的期望
(题目分析有点迷,读题很久,不知道是否有讲清楚,就是站在我的角度看一个知道了某几个数的人的最终成绩的期望。还是看不懂的去看原题吧。我自己也讲不清楚)

分析:
由于只有九个数,直接暴力dfs就可以
那么我们就枚举*号的数,记录星号个数为 cnt, 数字个数为cnt1, 井号个数为cnt2
那么 枚举的方案数就是 A(9-cnt,cnt)
然后对于每一个枚举的情况,去计算这种情况下,选择的期望;
再跑一个dfs,就可以了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int num[25] = { 0,0,0,0,0,0,10000,36,720,360,80,252,108,72,54,180,72,180,119,36,360,1080,144,1800,3600};
char mp[5][5];
int vis[10];
int cnt = 0, cnt1 = 0, cnt2 = 0;
char mp2[10];
int fial[10];
int idx = 0;
double allans = 0;
int ans[10];
int A(int n, int m)
{
    int res = 1;
    for (int i = 1; i <= m; i++) {
        res *= (n - i + 1);
    }
    return res;
}
void check1()
{
    ans[0] += num[fial[0] + fial[1] + fial[2]];
    ans[1] += num[fial[3] + fial[4] + fial[5]];
    ans[2] += num[fial[6] + fial[7] + fial[8]];
    ans[3] += num[fial[0] + fial[3] + fial[6]];
    ans[4] += num[fial[1] + fial[4] + fial[7]];
    ans[5] += num[fial[2] + fial[5] + fial[8]];
    ans[6] += num[fial[0] + fial[4] + fial[8]];
    ans[7] += num[fial[2] + fial[4] + fial[6]];

}

void dfs2(int num)
{
    if (num == 9)
    {
        check1();
        return;
    }
    if (fial[num] != 0) dfs2(num + 1);
    else {
        for (int i = 1; i <= 9; i++)
        {
            if (vis[i])continue;
            vis[i] = 1;
            fial[num] = i;
            dfs2(num + 1);
            fial[num] = 0;
            vis[i] = 0;
        }
    }
}

void dfs(int num)
{
    if (num == 9)
    {
        memset(ans, 0, sizeof(ans));
        dfs2(0);
        int maxx = 0;
        for (int i = 0; i < 8; i++)
        {
            maxx = max(maxx, ans[i]);

        }
        /*if (maxx) cout << maxx << endl;*/
        allans += maxx / (A(cnt2,cnt2)*1.0);
        return;
    }
    if (mp2[num] == '#') { dfs(num + 1); }
    else if (mp2[num] != '*') { fial[num] = mp2[num] - '0'; dfs(num + 1); }
    else {
        for (int i = 1; i <= 9; i++)
        {
            if (vis[i]) continue;
            vis[i] = 1;
            fial[num] = i;
            dfs(num + 1);
            vis[i] = 0;
        }
    }
}
int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        memset(vis, 0, sizeof(vis));
        memset(fial, 0, sizeof(fial));
        memset(mp2, 0, sizeof(mp2));
        int p = 0;
        cnt1 = 0;
        cnt2 = cnt = 0;
        idx = 0;
        allans = 0;
        for (int i = 1; i <= 3; i++)
        {
            scanf("%s", mp[i]);
            int len = strlen(mp[i]);
            for (int j = 0; j<len; j++)
            {
                if (mp[i][j] <= '9'&&mp[i][j] >= '0')
                {
                    int k = mp[i][j] - '0';
                    vis[k] = 1;
                    cnt1++;
                }
                if (mp[i][j] == '*')
                    cnt++;
                mp2[idx++] = mp[i][j];
            }
        }
        cnt2 = 9 - cnt1 - cnt;
        dfs(0);
        int k = A(9 - cnt1, cnt);
        double tt = allans / k * 1.0;
        printf("%.6lf\n", tt);

    }
    return 0;
}