传送门:Game SET
题意
一套牌有四种属性,每种属性都有三种特征,shapes (one, two, or three), shape (diamond, squiggle, or oval), shading (solid, striped, or open), color (red, green, or purple),如果是*,可以选任意一种。给出n套牌,每套牌给出[<number>][<shape>][<shading>][<color>],问有没有三张牌符合同一属性的特征要么全都相同,要么全都不同。
题解
暴力瞎搞就好了,这应该才是签到题吧....
先用map将字符串转换为数字记录下每张牌的四种属性,然后三个循环找三张牌,遍历属性,如果全都符合条件就输出三张牌的编号,如果没有符合条件的就输出-1。
如果遇到了 * ,如果另外两张相同,那么 * 可以和它们相同,否则和它们都不同,所以该属性只要有一个 * 符合条件。
如果没有 * ,就要么全都相同,要么全都不同符合条件。
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 map<string,int>p; 5 int a[10010][10]; 6 7 int main() 8 { 9 p["*"]=0; 10 p["one"]=1; 11 p["two"]=2; 12 p["three"]=3; 13 p["diamond"]=1; 14 p["squiggle"]=2; 15 p["oval"]=3; 16 p["solid"]=1; 17 p["striped"]=2; 18 p["open"]=3; 19 p["red"]=1; 20 p["green"]=2; 21 p["purple"]=3; 22 23 int t; 24 int tt=1; 25 cin>>t; 26 while(t--){ 27 int n; 28 cin>>n; 29 string s; 30 for(int i=0;i<n;i++){ 31 cin>>s; 32 string ss; 33 int cnt=0; 34 for(int j=0;j<s.size();j++){ 35 if(s[j]=='[') ss="",cnt++; 36 else if(s[j]==']') a[i+1][cnt]=p[ss]; 37 else ss+=s[j]; 38 } 39 } 40 cout<<"Case #"<<tt++<<": "; 41 int flag=0; 42 for(int i=1;i<=n;i++){ 43 for(int j=i+1;j<=n;j++){ 44 for(int k=j+1;k<=n;k++){ 45 int g=0; 46 for(int l=1;l<=4;l++){ 47 if(a[i][l]==0||a[j][l]==0||a[k][l]==0) continue; 48 if(a[i][l]==a[j][l]&&a[i][l]==a[k][l]) continue; 49 if(a[i][l]!=a[k][l]&&a[i][l]!=a[j][l]&&a[j][l]!=a[k][l]) continue; 50 g=1; 51 break; 52 } 53 if(!g){ 54 cout<<i<<' '<<j<<' '<<k<<endl; 55 flag=1; 56 } 57 if(flag) break; 58 } 59 if(flag) break; 60 } 61 if(flag) break; 62 } 63 if(!flag) cout<<-1<<endl; 64 } 65 return 0; 66 }