11A:篮球联赛
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
校篮球队每年都会举办“年级联赛”。篮球队的队员们将根据年级分为一年级、二年级、三年级和四年级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<iostream> 2 #include<cstring> 3 using namespace std; 4 char a[5][5]; 5 int score[5]; 6 int r = 4; 7 int check(){ 8 memset(score,0,sizeof(score)); 9 for(int i = 1; i <= 4; i++){ 10 for(int j = i+1; j <= 4; j++){ 11 if(a[i][j]=='W')score[i]++; 12 else if(a[i][j]=='L') score[j]++; 13 } 14 } 15 int ans = 1; 16 //cout<<score[1]<<endl; 17 for(int i = 2; i <= 4; i++){ 18 if(score[i]>score[1]) ans++; 19 // cout<<score[i]<<" "; 20 } 21 //cout<<endl; 22 return ans; 23 } 24 int dirx[3] = {2,2,3}; 25 int diry[3] = {3,4,4}; 26 void dfs(int step){ 27 if(step==3){ 28 r = min(r, check()); 29 return; 30 } 31 int x= dirx[step]; 32 int y = diry[step]; 33 if(a[x][y]=='?'){ 34 a[x][y] = 'W'; 35 dfs(step+1); 36 a[x][y] = 'L'; 37 dfs(step+1); 38 a[x][y] = '?'; 39 } 40 else 41 dfs(step+1); 42 } 43 int main(){ 44 int t; 45 cin>>t; 46 while(t--){ 47 int i, j; 48 for(i = 1; i <= 4; i++) 49 for(j = 1; j <= 4; j++) 50 cin>>a[i][j]; 51 for(i = 2; i <= 4; i++) 52 if(a[1][i]=='?') a[1][i] = 'W'; //涉及到1的比赛肯定让他赢 53 r = 4; 54 dfs(0); 55 cout<<r<<endl; 56 } 57 return 0; 58 }
备注:我太愚蠢了!!这么一道大水题我居然还上了对拍才明白哪有问题,但对拍实在是太香了。
用回溯来尝试所有可能(其实最多就8种),一定要注意置回原样啊!!!一切都是因为少写了标黄那一行!!因为只有判断到'?'才会填充,所以如果不置回?的话那么假如只有两个问号,首先尝试W W, 然后W L再回去试到L的时候,下一个格已经有之前遗留的L了,就不会尝试L W这种可能了,为什么这种错误我还需要对拍才发现啊!!!。