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这种可能了,为什么这种错误我还需要对拍才发现啊!!!。

posted @ 2020-06-14 15:01  timeaftertime  阅读(372)  评论(0编辑  收藏  举报