您的位置:首页 > 其它

POJ 1053 Set Me

2015-05-12 11:03 267 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: