题目大意
给一个3*3的方格填入 1-9 九个数 ,有些数是已知的,有些数是对方已知但我未知的(*),有些数是大家都未知的(#) ,每次只能求三个数,它取的是一行或者一列或者一个对角线,我要计算取得最大的对应值的期望
由于#和*是两个部分,所以要两次dfs;
总之,暴力打表;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
int getScore(int s) {
switch (s) {
case 6: return 10000;
case 7: return 36;
case 8: return 720;
case 9: return 360;
case 10: return 80;
case 11: return 252;
case 12: return 108;
case 13: return 72;
case 14: return 54;
case 15: return 180;
case 16: return 72;
case 17: return 180;
case 18: return 119;
case 19: return 36;
case 20: return 360;
case 21: return 1080;
case 22: return 144;
case 23: return 1800;
case 24: return 3600;
}
}
char mp[10][10];
int a[3][3];
double sum, num;
double r[3], c[3];
double dd[2];
long long cnt = 0;
void dfs2(bool used[], int x, int y) {
if (x >= 3) {
for (int i = 0; i < 3; i++) {
int temp = 0;
for (int j = 0; j < 3; j++) {
temp += a[i][j];
}
r[i] += getScore(temp);
}
for (int i = 0; i < 3; i++) {
int temp = 0;
for (int j = 0; j < 3; j++) {
temp += a[j][i];
}
c[i] += getScore(temp);
}
dd[0] += getScore(a[0][0] + a[1][1] + a[2][2]);
dd[1] += getScore(a[2][0] + a[1][1] + a[0][2]);
cnt++;
return;
}
int nx = x;
int ny = y + 1;
if (ny >= 3) {
nx++;
ny = 0;
}
if (mp[x][y] != '#') {
dfs2(used, nx, ny);
}
else {
for (int i = 1; i <= 9; i++) {
if (!used[i]) {
used[i] = true;
a[x][y] = i;
dfs2(used, nx, ny);
a[x][y] = 0;
used[i] = false;
}
}
}
}
void dfs(bool used[], int x, int y) {
if (x >= 3) {
cnt = 0;
for (int i = 0; i < 3; i++) {
r[i] = 0;
c[i] = 0;
}
dd[0] = 0;
dd[1] = 0;
dfs2(used, 0, 0);
double temp = 0;
for (int i = 0; i < 3; i++) {
temp = max(temp, c[i]);
temp = max(temp, r[i]);
}
temp = max(temp, dd[0]);
temp = max(temp, dd[1]);
sum += temp / cnt;
num += 1;
return;
}
int nx = x;
int ny = y + 1;
if (ny >= 3) {
nx++;
ny = 0;
}
if (mp[x][y] != '*') {
dfs(used, nx, ny);
}
else {
for (int i = 1; i <= 9; i++) {
if (!used[i]) {
used[i] = true;
a[x][y] = i;
dfs(used, nx,ny);
a[x][y] = 0;
used[i] = false;
}
}
}
}
int main() {
int t;
cin >> t;
while (t--) {
for (int i = 0; i < 3; i++) {
scanf("%s", mp[i]);
}
sum = 0, num = 0;
bool used[100];
memset(used, false, sizeof(used));
memset(a, 0, sizeof(a));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (mp[i][j] >= '1'&&mp[i][j] <= '9') {
used[mp[i][j]-'0'] = true;
a[i][j] = mp[i][j] - '0';
}
}
}
dfs(used, 0, 0);
printf("%.6f\n", sum / num);
}
}