做法: 模擬賽時6重循環暴力過了,但是聽了聽超霸的三進制枚舉子集,感覺有些意思,就寫了寫,複雜度相同。其中中間代碼比較糙,沒有優化,無腦寫的。
AC代碼:
#include<bits/stdc++.h>
using namespace std;
#define IO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb(x) push_back(x)
#define sz(x) (int)(x).size()
#define sc(x) scanf("%d",&x)
#define abs(x) ((x)<0 ? -(x) : x)
#define all(x) x.begin(),x.end()
#define mk(x,y) make_pair(x,y)
#define fin freopen("in.txt","r",stdin)
#define fout freopen("out.txt","w",stdout)
typedef long long ll;
typedef pair<int,int> PII;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 5e6+5;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f;
const ll LINF = 1ll<<62;
int ans[maxn];
int res[20][20][20][20];
int so[4];
void cal(int x)
{
int k = 0;
while(x)
{
ans[k++] = x%3;
x/=3;
}
}
void solve()
{
for(int s = 0;s<729;s++)
{
cal(s);
memset(so,0,sizeof(so)); //0-A 1-B 2-C 3-D
for(int i=0;i<6;i++)//i:0-->AB 1-->AC 2-->AD 3-->BC 4-->BD 5-->CD
{
if(i == 0){
if(ans[i] == 2) so[0]+=3;
if(ans[i] == 1) so[0]++,so[1]++;
if(ans[i] == 0) so[1]+=3;
}
if(i == 1){
if(ans[i] == 2) so[0]+=3;
if(ans[i] == 1) so[0]++,so[2]++;
if(ans[i] == 0) so[2]+=3;
}
if(i == 2){
if(ans[i] == 2) so[0]+=3;
if(ans[i] == 1) so[0]++,so[3]++;
if(ans[i] == 0) so[3]+=3;
}
if(i == 3){
if(ans[i] == 2) so[1]+=3;
if(ans[i] == 1) so[1]++,so[2]++;
if(ans[i] == 0) so[2]+=3;
}
if(i == 4){
if(ans[i] == 2) so[1]+=3;
if(ans[i] == 1) so[1]++,so[3]++;
if(ans[i] == 0) so[3]+=3;
}
if(i == 5){
if(ans[i] == 2) so[2]+=3;
if(ans[i] == 1) so[2]++,so[3]++;
if(ans[i] == 0) so[3]+=3;
}
}
//cout<<so[0]<<" "<<so[1]<<" "<<so[2]<<" "<<so[3]<<endl;
res[so[0]][so[1]][so[2]][so[3]]++;
}
}
int main()
{
// fin;
IO;
solve();
int t,idx = 1;
cin>>t;
while(t--)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
if(a>9 || b>9 || c>9 || d>9){
cout<<"Case #"<<idx++<<": "<<"Wrong Scoreboard"<<endl;
continue;
}
if(res[a][b][c][d]>1) cout<<"Case #"<<idx++<<": "<<"No"<<endl;
else if(res[a][b][c][d] == 1)cout<<"Case #"<<idx++<<": "<<"Yes"<<endl;
else cout<<"Case #"<<idx++<<": "<<"Wrong Scoreboard"<<endl;
}
return 0;
}