POJ 1053 Set Me

本文详细解析了POJ1053-SetMe问题,介绍了如何通过暴力搜索找到所有符合条件的牌组(set),并分享了处理特殊输入格式的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:POJ 1053-Set Me

题意是这样的:定义了一种扑克牌,他们有四个特性(characters),如果有三张牌,满足:这四个特性中的每一个要么相一致,要么完全不相一致,那么这三张牌构成了一个set

按要求格式输出所有的set,如果一个set也没有,输出 ***None Found***

此题难点有:

①对于输入的处理,从Sample Input可以发现,整个测试以EOF结束,每组样例之间只是隔着一个空行,每组样例开始的时候并不会告诉你这组样例的规模。因此,对于我这样的新手。。。输入的技巧就不够用了。。最后还是参考的网上的处理。。对于字符串,用if(gets(element[i++])==NULL)表示读到了一个空行,(NULL,空指针,在这里指向的是字符首位),另外用while( gets (element [ i ] )!=NULL &&  strcmp ( element [ i ],""))对应空行读入。

②没想到这个题是暴搜就可以过的。。题目中貌似没有说规模大小。。这个也是坑。

贴代码:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstdio>
//#define file
using namespace std;
char element[100][10];
int ans [100][3];
int ansnum=0;
int i;
int check1(char a,char b,char c)//check each char suit the need or not
{
    if(a==b&&b==c)
        return 1;
    else
    {
        if(a==b||b==c||a==c)
            return 0;
    }
    return 1;
}
int check2(char *s1,char *s2,char *s3)//check if 3 elements can come up to a set
{
    for(int i=0; i<4; i++)
    {
        if(!(check1(s1[i],s2[i],s3[i])))
            return 0;
    }
    return 1;
}
void check3()//work out the set finally
{
    for(int t=0; t<i-2; t++)
    {
        for(int p=t+1; p<i-1; p++)
        {
            for(int q=p+1; q<i; q++)
                if(check2(element[t],element[p],element[q]))
                {
                    if(ansnum==0)
                    {
                        printf("   1.  ");
                        printf("%s %s %s\n",element[t],element[p],element[q]);
                        ansnum++;
                    }
                    else
                    {
                        printf("        %d.  ",ansnum+1);
                        printf("%s %s %s\n",element[t],element[p],element[q]);
                        ansnum++;
                    }
                }
        }
    }
}
int main()
{
#ifdef file
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif // file

    while(1)
    {
        i=0;
        ansnum=0;
        if(gets(element[i++])==NULL)
            break;
        while(gets(element[i])!=NULL&&strcmp(element[i],""))
        {
            i++;
        }
        printf("CARDS: ");
        for(int j=0; j<i; j++)
        {
            printf(" %s",element[j]);
        }
        printf("\n");
        printf("SETS:");
        check3();
        if(ansnum==0)
        {
            printf("   *** None Found ***\n");
        }

        printf("\n");
    }


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值