2020牛客多校第八场G题 Game SET(???)

原题:Game SET
题面:

2020牛客多校第八场G题 Game SET(???)_第1张图片

题目大意:

给你 n n n 个字符串,每个字符串包含以下四种牌(每种牌三个属性):

  1. n u m b e r   o f   s h a p e s ( o n e ,   t w o   , t h r e e ) number\ of\ shapes(one,\ two\ ,three) number of shapes(one, two ,three)
  2. s h a p e s ( d i a m o n d , s q u i g g l e , o r o v a l ) shapes (diamond, squiggle, or oval) shapes(diamond,squiggle,oroval)
  3. s h a d i n g ( s o l i d , s t r i p e d , o r o p e n ) shading (solid, striped, or open) shading(solid,striped,oropen)
  4. c o l o r ( r e d , g r e e n , o r p u r p l e ) color (red, green, or purple) color(red,green,orpurple)

还有一个万能牌 ′ ∗ ′ '*' ,能够代表任意所有属性。
牌的顺序是固定的: [ n u m b e r ] [ s h a p e s ] [ s h a d i n g ] [ c o l o r ] [number][shapes][shading][color] [number][shapes][shading][color]
让我们找出三组牌能够构成一个集合,该集合满足的条件为:对于每组牌的每个属性,它要么全部一样,要么全部都不一样。如果不能找到输出-1,否则任意输出其位置。

思路:

没有思路,看得题解,比赛没写,队友暴力过了。有遇到模拟大神和rand大法过的,所以不多做赘述。这题,题解说的暴力,确实很暴力, O ( n 3 ) O(n^3) O(n3) 都能过,据说不能构成SET的集合最大就是20. 枚举21张肯定可以找到SET。详细证明:here,不知道是不是要科学上网才打得开
总之,莽就是了。

代码:
#include 
#define sc scanf
#define pf printf
using namespace std;
const int N = 300;
char str[N][50];
string s[N][10];

bool conform(string s1, string s2, string s3)
{
    if(s1 == s2 && s1 != s3 && s1 != "*" && s3 != "*") return false;
    if(s1 == s3 && s1 != s2 && s1 != "*" && s2 != "*") return false;
    if(s2 == s3 && s1 != s2 && s1 != "*" && s2 != "*") return false;
    return true;
}

bool check(int x, int y, int z)
{
    for(int i = 1; i <= 4; i++)
        if(!conform(s[x][i], s[y][i], s[z][i])) return false;
    return true;
}

void solve(int cas)
{
    int n;
    sc("%d", &n);
    for(int i = 1; i <= n; i++) {
        sc("%s", &str[i]);
        s[i][1] = s[i][2] = s[i][3] = s[i][4] = "";
        int len = strlen(str[i]);
        int cnt = 1;
        for(int j = 0; j < len; j++) {
            if(str[i][j] == ']') {cnt++; continue;}
            else if(str[i][j] != '[')   s[i][cnt] += str[i][j]; 
        }
    }
    
    pf("Case #%d: ", cas);
    bool flag = false;
    for(int i = 1; i <= n - 2; i++) {
        for(int j = i + 1; j <= n - 1; j++) {
            for(int k = j + 1; k <= n; k++)
                if(check(i, j, k)) {
                    flag = true;
                    pf("%d %d %d\n", i, j, k);
                    break;
                }
            if(flag) break;
        }
        if(flag) break;
    }
    if(!flag) puts("-1");
}

int main()
{
    int t; sc("%d", &t); for(int i = 1; i <= t; i++) solve(i);
    return 0;
}

你可能感兴趣的:(2020牛客多校第八场G题 Game SET(???))