传送门: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 }