题意:有四个队伍,两两之间比赛,赢的得三分,输的不得分,平的各得一分,告诉你最后各个队伍的得分,问这个得分结果,每个队之间的比赛结果是不是唯一的,若是则输出Yes,若有解但不是唯一的则输出No,否则输出Impossible
解题思路:dfs预处理出六次比赛的所有结果,然后进行统计
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <functional>
using namespace std;
#define LL long long
const int INF = 0x3f3f3f3f;
int vis[100000],a[10],b[10],c[10];
pair<int,int>p[10];
void dfs(int k)
{
if(k==7)
{
memset(b,0,sizeof b);
for(int i=1;i<7;i++)
{
if(a[i]==1) b[p[i].first]+=3;
else if(a[i]==2) b[p[i].second]+=3;
else b[p[i].first]++,b[p[i].second]++;
}
int sum=0;
for(int i=1;i<5;i++) sum=sum*10+b[i];
vis[sum]++;
return ;
}
for(int i=1;i<4;i++)
{
a[k]=i;
dfs(k+1);
}
}
int main()
{
p[1]=make_pair(1,2);
p[2]=make_pair(1,3);
p[3]=make_pair(1,4);
p[4]=make_pair(2,3);
p[5]=make_pair(2,4);
p[6]=make_pair(3,4);
dfs(1);
int t,cas=0;
scanf("%d",&t);
while(t--)
{
int sum=0,flag=1;
for(int i=1;i<=4;i++)
{
scanf("%d",&c[i]);
if(c[i]>=10) flag=0;
sum=sum*10+c[i];
}
if(!flag||!vis[sum]) {printf("Case #%d: Wrong Scoreboard\n",++cas);continue;}
if(vis[sum]==1) printf("Case #%d: Yes\n",++cas);
else printf("Case #%d: No\n",++cas);
}
return 0;
}