• 牛客多校(2020第八场)G-Game SET


    题意:输入n种牌以及牌的属性,任意选3张,这3张满足4种属性,要么全相同,要么全不同,“*”是万能牌,可以变成你想要的任意的牌,输出3张拍的序号。

    题解:暴力枚举

    更新一种更简洁明了的代码

     1 //暴力
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<vector>
     6 #include<string>
     7 #include<unordered_map>
     8 #include<set>
     9 using namespace std;
    10 
    11 const int N = 260;
    12 vector <string> vet;
    13 unordered_map<string, string> ma, mb, mc, md, mp;
    14 
    15 void init() {
    16     mp["one"]="1";
    17     mp["two"]="2";
    18     mp["three"]="3";
    19     mp["diamond"]="1";
    20     mp["squiggle"]="2";
    21     mp["oval"]="3";
    22     mp["solid"]="1";
    23     mp["striped"]="2";
    24     mp["open"]="3";
    25     mp["red"]="1";
    26     mp["green"]="2";
    27     mp["purple"]="3";
    28     mp["*"]="0";
    29 }
    30 
    31 
    32 inline string read() {
    33     string p;
    34     p = "";
    35     char ch = getchar();
    36     while ((ch < 'a' || ch > 'z') && ch != '*')  {
    37         ch = getchar();
    38     }
    39     while ((ch >= 'a' && ch <= 'z') || ch == '*') {
    40         p += ch;
    41         ch = getchar();
    42     }
    43     return p;
    44 }
    45 
    46 bool worng(char fir, char sec, char thi) {
    47     if (fir == '0' || sec == '0' || thi == '0')   return 0; //只要有一个为万能*则符合
    48     else {
    49         if (fir == sec && sec == thi)   return 0;
    50         if (fir != sec && fir != thi && sec != thi) return 0;
    51     }
    52 
    53     return 1;
    54 }
    55 
    56 bool judge(int i, int j, int k) {
    57     string fri = vet[i], sec = vet[j], thr = vet[k];
    58     bool one = worng(fri[0], sec[0], thr[0]);
    59     bool two = worng(fri[1], sec[1], thr[1]);
    60     bool three = worng(fri[2], sec[2], thr[2]);
    61     bool four = worng(fri[3], sec[3], thr[3]);
    62     if (one || two || three || four)    return false;
    63     return true;
    64 }
    65 
    66 void solve(int n, int t) {
    67     for (int i = 0; i < n - 2; i++) {
    68         for (int j = i+1; j < n - 1; j++) {
    69             for (int k = j+1; k < n; k++) {
    70                 if (judge(i, j, k)) {
    71                     printf("Case #%d: %d %d %d
    ", t, i+1, j+1, k+1);
    72                     return;
    73                 }
    74             }
    75         }
    76     }
    77     printf("Case #%d: -1
    ", t);
    78 }
    79 
    80 int main() {
    81     int T;
    82     cin >> T;
    83     init();
    84     for (int cas = 1; cas <= T; cas++) {
    85         int n;
    86         vet.clear();
    87         cin >> n;
    88         for (int i = 0; i < n; i++) {
    89             string one = read();
    90             string two = read();
    91             string three = read();
    92             string four = read();
    93             vet.push_back({mp[one]+mp[two]+mp[three]+mp[four]});
    94         }
    95         solve(n, cas);
    96     }
    97     return 0;
    98 }

    分割线——————————————————————

     1 //暴力
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<vector>
     6 #include<string>
     7 #include<unordered_map>
     8 #include<set>
     9 using namespace std;
    10 
    11 const int N = 260;
    12 
    13 char s[N][50];
    14 string ss[N][6];
    15 
    16 
    17 bool worng(string fir, string sec, string thi) {
    18     if (fir == "*" || sec == "*" || thi == "*")   return 0; //只要有一个为万能*则符合
    19     else {
    20         if (fir == sec && sec == thi)   return 0;
    21         if (fir != sec && fir != thi && sec != thi) return 0;
    22     }
    23     return 1;
    24 }
    25 
    26 bool judge(int id1, int id2, int id3) {
    27     bool one = worng(ss[id1][1],ss[id2][1],ss[id3][1]);
    28     bool two = worng(ss[id1][2],ss[id2][2],ss[id3][2]);
    29     bool three = worng(ss[id1][3],ss[id2][3],ss[id3][3]);
    30     bool four = worng(ss[id1][4],ss[id2][4],ss[id3][4]);
    31     if (one || two || three || four)    return false;
    32     return true;
    33 }
    34 
    35 void solve(int n, int t) {
    36     for (int i = 0; i < n - 2; i++) {
    37         for (int j = i+1; j < n - 1; j++) {
    38             for (int k = j+1; k < n; k++) {
    39                 if (judge(i, j, k)) {
    40                     printf("Case #%d: %d %d %d
    ", t, i+1, j+1, k+1);
    41                     return;
    42                 }
    43             }
    44         }
    45     }
    46     printf("Case #%d: -1
    ", t);
    47 }
    48 
    49 int main() {
    50     int T;
    51     cin >> T;
    52     for (int cas = 1; cas <= T; cas++) {
    53         int n;
    54         cin >> n;
    55         for (int i=0; i<n; i++){
    56             scanf ("%s",s[i]);
    57             int len=strlen(s[i]);
    58             int cnt=1;
    59             ss[i][1]=ss[i][2]=ss[i][3]=ss[i][4]="";
    60             for (int j=0; j<len; j++){
    61                 if (s[i][j]==']') {cnt++; continue;}
    62                 else if (s[i][j]=='[') continue;
    63                 ss[i][cnt]+=s[i][j];
    64             }
    65         }
    66         solve(n, cas);
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    2014年3月新鲜出炉的最佳 JavaScript 工具库
    开发者不容错过的10款免费JavaScript游戏引擎
    创建Android环境并且安装cordova
    程序员技术练级攻略
    android sdk更新后出现please update ADT to the latest version的解决方法
    Linux cscope命令
    UltraISO制作系统ISO镜像
    Windows Live Writer 使用指南
    C语言访问网页
    Linux minicom命令
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/15367583.html
Copyright © 2020-2023  润新知