题意
一套牌有四种属性,每种属性都有三种特征,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。
如果遇到了 * ,如果另外两张相同,那么 * 可以和它们相同,否则和它们都不同,所以该属性只要有一个 * 符合条件。
如果没有 * ,就要么全都相同,要么全都不同符合条件。
代码
#include<bits/stdc++.h> using namespace std; map<string,int>p; int a[10010][10]; int main() { p["*"]=0; p["one"]=1; p["two"]=2; p["three"]=3; p["diamond"]=1; p["squiggle"]=2; p["oval"]=3; p["solid"]=1; p["striped"]=2; p["open"]=3; p["red"]=1; p["green"]=2; p["purple"]=3; int t; int tt=1; cin>>t; while(t--){ int n; cin>>n; string s; for(int i=0;i<n;i++){ cin>>s; string ss; int cnt=0; for(int j=0;j<s.size();j++){ if(s[j]=='[') ss="",cnt++; else if(s[j]==']') a[i+1][cnt]=p[ss]; else ss+=s[j]; } } cout<<"Case #"<<tt++<<": "; int flag=0; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ for(int k=j+1;k<=n;k++){ int g=0; for(int l=1;l<=4;l++){ if(a[i][l]==0||a[j][l]==0||a[k][l]==0) continue; if(a[i][l]==a[j][l]&&a[i][l]==a[k][l]) continue; if(a[i][l]!=a[k][l]&&a[i][l]!=a[j][l]&&a[j][l]!=a[k][l]) continue; g=1; break; } if(!g){ cout<<i<<' '<<j<<' '<<k<<endl; flag=1; } if(flag) break; } if(flag) break; } if(flag) break; } if(!flag) cout<<-1<<endl; } return 0; }