#include #include char name[4][4]; int target; int score[4][4]; int un[4][2]; double pt[9]; typedef struct { int team; int val; } set; void input() { int unc = 0; char str[100]; int i, j; gets(str); for (i = 0; i < 4; i++) { if (str[(i+1)*5] == '*') target = i; name[i][0] = str[(i+1)*5+1]; name[i][1] = str[(i+1)*5+2]; name[i][2] = str[(i+1)*5+3]; name[i][3] = 0; } for (i = 0; i < 4; i++) { gets(str); for (j = 0; j < 4; j++) { if (j <= i) continue; if (str[(j+1)*5+1] == '_') { score[i][j] = 9; un[unc][0] = i; un[unc][1] = j; unc++; } else { score[i][j] = str[(j+1)*5+1] - '0'; } if (str[(j+1)*5+3] == '_') { score[j][i] = 9; un[unc][0] = j; un[unc][1] = i; unc++; } else { score[j][i] = str[(j+1)*5+3] - '0'; } } } } void rank(int p[4], int *f, int *s) { int max, maxn, maxi[4], tmp, tmpi; int i, j; max = -9999; maxn = 0; for (i = 0; i < 4; i++) { if (max < p[i]) { maxn = 1; max = p[i]; maxi[0] = i; } else if (max == p[i]) { maxi[maxn] = i; maxn++; } } if (maxn > 2) { *f = *s = -1; return; } if (maxn == 2) { *f = maxi[0]; *s = maxi[1]; return; } *f = maxi[0]; tmp = max; tmpi = maxi[0]; p[tmpi] = -9999; for (i = 0; i < 4; i++) { if (max < p[i]) { maxn = 1; max = p[i]; maxi[0] = i; } else if (max == p[i]) { maxi[maxn] = i; maxn++; } } p[tmpi] = tmp; if (maxn >= 2) {*s = -1; return;} *s = maxi[0]; return; } int cmp(const set *a, const set *b) { if (a->val > b->val) return 1; if (a->val == b->val) return 0; return -1; } int ran(int p[4], int from, int to) { } int isadv() { set win[4] = {0,0,0,0}; set dif[4] = {0,0,0,0}; set goal[4] = {0,0,0,0}; int i, j, f, s; for (i = 0; i < 4; i++) { win[i].team = i; for (j = 0; j < 4; j++) { if (score[i][j] > score[j][i]) { win[i].val += 3; } else { win[i].val++; } } } qsort(win, 4, sizeof(set), cmp); rank(win, &f, &s); if (f == target || s == target) { return 1; } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { dif[i] += score[i][j] - score[j][i]; } } rank(dif, &f, &s); if (f == target || s == target) { return 1; } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { goal[i] == score[i][j]; } } rank(goal, &f, &s); if (f == target || s == target) { return 1; } return 0; } /* int isadv() { int win[4] = {0,0,0,0}; int dif[4] = {0,0,0,0}; int goal[4] = {0,0,0,0}; int i, j, f, s; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (score[i][j] > score[j][i]) { win[i] += 3; } else { win[i]++; } } } rank(win, &f, &s); if (f == target || s == target) { return 1; } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { dif[i] += score[i][j] - score[j][i]; } } rank(dif, &f, &s); if (f == target || s == target) { return 1; } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { goal[i] == score[i][j]; } } rank(goal, &f, &s); if (f == target || s == target) { return 1; } return 0; } */ int comb(int n) { int r = 1; int j; for (j = 2; j < 9; j++) { r *= j; } for (j = 2; j <= n; j++) { r /= j; } for (j = 2; j <= 8 - n; j++) { r /= j; } return r; } void mktbl() { int i, j; double res = 1; for (i = 0; i < 9; i++) { pt[i] = pow(0.25, i) * pow(0.75, 8-i); printf("))%d\n", comb(i)); pt[i] *= (double)comb(i); } } int main() { int N, lp; int i, j, k, l; char str[10]; double prob; stdin = freopen("gucup.txt", "r", stdin); gets(str); N = atoi(str); mktbl(); for (i = 0; i < 9; i++) { printf(">>%f\n", pt[i]); } for (lp = 0; lp < N; lp++) { prob = 0.0; input(); for (i = 0; i <=8; i++) { for (j = 0; j <=8; j++) { for (k = 0; k <=8; k++) { for (l = 0; l <=8; l++) { score[un[0][0]][un[0][1]] = i; score[un[1][0]][un[1][1]] = j; score[un[2][0]][un[2][1]] = k; score[un[3][0]][un[3][1]] = l; if (isadv()) { prob += pt[i] * pt[j] * pt[k] * pt[l]; } } } } } printf("%lf\n", prob); } } /* for (i = 0; i < 4; i++) { printf("%s\n", name[i]); } printf("%d\n", target); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (i == j) { printf("- "); continue; } printf("%d ", score[i][j]); } printf("\n"); } printf("--------\n"); */