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

  • 相关阅读:
    13 文件操作
    10 dict嵌套与升级
    08 连接和顺序列表
    01 Python 逻辑运算
    了解bordercollapse
    orchard模块编写的错误及其解决办法
    orchard文档之理解内容处理器
    orchard文档之理解数据访问
    orchard文档之orchard工作原理
    orchard文档之创建自定义表单
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/13124849.html
Copyright © 2020-2023  润新知