此题的难点有以下几个:
1.可能想不到暴力搜索即可,执着于找什么规律
2.要么是以为是划分集合的题目,要么没读懂题目
3.如何处理输入的每一组数据。
该问题实际是列出所有可能结果集合,集合用暴力搜索。对于数据,用getchar,可以方便处理eof,并且设置两个int “指针” 辅助输入。
还要特别小心i、j、k在使用过程中不混淆
#include<stdio.h>
int check(int i,char *a,char *b,char *c)
{
if(*(a+i)==*(b+i)&&*(a+i)==*(c+i))
return 1;
else if(*(a+i)!=*(b+i)&&*(a+i)!=*(c+i)&&*(b+i)!=*(c+i))
return 1;
return 0;
}
int main()
{
char s[12][4];
char tmp;
int n1=0,n2=0;
int Flag=0;
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(!Flag&&(tmp=getchar()))
{
if(tmp=='\n')
{;}
if(tmp!='\n')
{
if(n1<3&&n2<=11)
{
s[n2][n1]=tmp;
n1++;
}
else if(n1==3&&n2<11)
{
s[n2][n1]=tmp;
n1=0;
n2++;
}
else if(n1==3&&n2==11)
{
getchar();
if((getchar())==EOF)
Flag=1;
s[n2][n1]=tmp;
printf("CARDS: ");
int q;
for( q=0;q<12;q++)
{
printf(" ");
for(int p=0;p<4;p++)
printf("%c",s[q][p]);
}
printf("\n");
int cnt=0;
int i,j,k;
printf("SETS: ");
for( i=0;i<12;i++)
{
//printf("i=%d j=%d k=%d\n",i,j,k);
for( j=i+1;j<12;j++)
{
for( k=j+1;k<12;k++)
{
int flag=0;
if(check(0,s[i],s[j],s[k])&&check(1,s[i],s[j],s[k])&&check(2,s[i],s[j],s[k])&&check(3,s[i],s[j],s[k]))
flag++;
if(flag==1)
{
cnt++;
if(cnt==1)
printf(" ");
else printf(" ");
printf("%d. ",cnt);
//printf("---------\n");
int x;
for( x=0;x<4;x++)
//printf("--555-------\n");
printf("%c",s[i][x]);
printf(" ");
for( x=0;x<4;x++)
//printf("-----444----\n");
printf("%c",s[j][x]);
printf(" ");
for( x=0;x<4;x++)
// printf("----555222-----\n");
printf("%c",s[k][x]);
printf(" ");
printf("\n");
}
}
}
}
if(cnt==0)
printf(" *** None Found ***\n");
printf("\n");
n2=0;
n1=0;
}
}}
return 0;
}