总时间限制:
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
就是说,二进制模拟一下剩下的比赛状态
再枚举
#include<iostream>
#include<cstring>
using namespace std;
char match[4][4];
int points[4]={};
int undone[4][3]={};
int main()
{
int T;
cin>>T;
while(T--)
{
memset(match,' ',sizeof(match));
memset(points,0,sizeof(points));
memset(undone,0,sizeof(undone));
int cnt=0;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
cin>>match[i][j];
if(j>i)
{
if(match[i][j]=='W')
points[i]++;
else if(match[i][j]=='L')
points[j]++;
else if(match[i][j]=='?')
{
if(i==0)
points[i]++;
else
{
undone[cnt][0]=i;
undone[cnt][1]=j;
undone[cnt][2]=0;//储存剩下的比赛场数
cnt++;
}
}
}
}
int ans=4;
int points_[4]={};
/*笨拙的模拟二进制
for(int i=0;i<=1<<(cnt);i++)
{
int pos=0;
undone[0][2]++;
for(int j=0;j<4;j++)
points_[j]=points[j];
while(undone[pos][2]>1)
{
undone[pos][2]=0;
pos++;
undone[pos][2]++;
}
for(int j=0;j<cnt;j++)
{
if(undone[j][2]==1)
points_[undone[j][0]]++;
else
points_[undone[j][1]]++;
}
int _ans=1;
for(int j=1;j<4;j++)
if(points_[j]>points_[0])
_ans++;
ans=min(_ans,ans);
}*/
for(int i=0;i<=1<<(cnt);i++)//二进制储存状态
{
memcpy(points_,points,sizeof(points));
for(int j=0;j<cnt;j++)
{
if((i>>j)&1)
points_[undone[j][0]]++;
else
points_[undone[j][1]]++;
}
int _ans=1;
for(int j=1;j<4;j++)
if(points_[j]>points_[0])
_ans++;
ans=min(_ans,ans);
}
cout<<ans<<endl;
}
}