B01:篮球联赛
描述
校篮球队每年都会举办“年级联赛”。篮球队的队员们将根据年级分为一年级、二年级、三年级和四年级4支队伍,参与角逐。
在年级联赛中,不同队伍两两之间比赛一场,胜者积1分,负者积0分(篮球比赛无平局)。最终队伍将按照积分从高到低排名,若出现同分,则年级较低的排名靠前。
现在年级联赛正在进行中,有些比赛已经结束,有些比赛则因种种原因还未进行。请你根据当前的比赛情况,计算出一年级队在联赛结束后,有可能得到的最高名次。
输入输入包含多组数据。第一行是一个整数T(1 <= T <= 100),表示数据组数。
对于每组数据,用一个4*4的字符矩阵表示当前的比赛情况。第i行第j列表示i年级与j年级的比赛情况,其中:
“-”表示i与j相同,无比赛
“W”表示i年级胜j年级
“L”表示i年级负j年级
“?”表示i年级和j年级的比赛还未进行
输入
数据保证正确不存在矛盾,且无多余空格或空行。
输出
对于每组数据,输出一个整数,即一年级队在联赛结束后,有可能获得的最高名次。
样例输入
2
-LL?
W-L?
WW-L
??W-
-WL?
L-?L
W?-L
?WW-
样例输出
3
1
1 #include <cstdio> 2 #include <string> 3 #include <memory> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <math.h> 7 #include <iostream> 8 using namespace std; 9 10 int main() 11 { 12 int t; 13 scanf("%d", &t); 14 while (t--) { 15 char info[5][5]; 16 int point[5] = { 0 }; 17 for (int i = 1; i <= 4; i++) 18 for (int j = 1; j <= 4; j++) 19 { 20 cin >> info[i][j]; 21 if (j > i) 22 { 23 if (info[i][j] == 'W') 24 point[i]++; 25 else if (info[i][j] == 'L') 26 point[j]++; 27 } 28 } 29 int notdefined[4][3],h=1; 30 for(int i=1;i<=3;i++) 31 for(int j=i+1;j<=4;j++) 32 if (info[i][j] == '?') { 33 if (i == 1) 34 point[1]++; 35 else if (point[i] > point[1]) 36 point[i]++; 37 else if (point[j] > point[1]) 38 point[j]++; 39 else 40 notdefined[h][0] = i,notdefined[h][1]=j,notdefined[h++][2]=0; 41 } 42 int _point[5], ans = 4; 43 for (int i = 1; i <=1<<(h-1); i++) { 44 int tmp = 1; 45 notdefined[1][2]++; 46 while (notdefined[tmp][2] > 1) { 47 notdefined[tmp][2] = 0; 48 tmp++; 49 notdefined[tmp][2]++; 50 } 51 for (int j = 1; j <= 4; j++) 52 _point[j] = point[j]; 53 for (int j = 1; j <= h - 1; j++) { 54 if (notdefined[j][2] == 1) 55 _point[notdefined[j][0]]++; 56 else 57 _point[notdefined[j][1]]++; 58 } 59 int _ans = 1; 60 for (int i = 2; i <= 4; i++) 61 if (_point[i] > _point[1]) 62 _ans++; 63 ans = min(_ans, ans); 64 } 65 printf("%d\n", ans); 66 } 67 return 0; 68 }