题意: 选择3张卡牌,并且每张卡牌中,每个属性要么全部一样,要么全部不一样。
暴力枚举3个点。官方题解 最多枚举21次。进不去网站就离谱
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
#define sc scanf
#define pf printf
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long LL;
const int INF = 0x3f3f3f3f;
const double eps = 1e-4;
const int mod = 1e9+7;
const int N = 1010;
string p[N][5];
void change_str(int pos,string s){
int j = 0; string m;
for(int i=0;i<(int)s.size();i++){
if(s[i] == ']') p[pos][j] = m;
else if(s[i] == '[') j ++,m = "";
else m += s[i];
}
}
bool is_set(int i,int j,int z){
for(int k=1;k<=4;k++){
int cnt = 0;
if(p[i][k] == "*") cnt ++;
if(p[j][k] == "*") cnt ++;
if(p[z][k] == "*") cnt ++;
if(cnt == 0){//只要有一个是*就一定成立
if((p[i][k] == p[j][k] && p[i][k] != p[z][k]) ||
(p[z][k] == p[j][k] && p[i][k] != p[z][k]) ||
(p[i][k] == p[z][k] && p[i][k] != p[j][k]) ) return false;
}
}
return true;
}
signed main(){
IOS;
#ifdef ddgo
freopen("C:/Users/asus/Desktop/ddgoin.txt","r",stdin);
#endif
int tt; cin>>tt;
for(int zz=1;zz<=tt;zz++){
string s;
int n; cin>>n;
for(int i=1;i<=n;i++) cin>>s,change_str(i,s);
bool plas = false; n = min(n,21ll);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int z=j+1;z<=n;z++)
if(is_set(i,j,z)){
plas = true;
cout<<"Case #"<<zz<<": "<<i<<" "<<j<<" "<<z<<endl;
goto out ;
}
out :
if(!plas) cout<<"Case #"<<zz<<": "<<-1<<endl;
}
return 0;
}