这道题的大意这样的:
给定一个小写字符串str,要求你对它进行猜测,每次只能猜一个字符,如果你猜的这个字符在str中,那么此次猜测正确,并且所有在str里的相同字符都算作猜对;如果你猜的这个字符不在str中,那么此次猜测错误,猜错次数+1。如果在猜错次数达到7次(或:>=7次)时,你还没有完全猜出str里的所有字符,那么“You lose.”;如果在猜错次数达到7次之前,你已经完全猜出str里的所有字符,那么"You win.";如果在猜错次数达到7次之前,你没有完全猜出str里的所有字符,那么"You chickened out."。
其中需要注意两点:
1,如果你猜的字符,在str中,那么str里所有相同的字符都被算作猜对;
2,同样猜错的字符,只算作猜错一次(不重复计算)。
个人解题思路参考:
根据此题的题意和上面的两点注意,可以发现,给出的猜测字符串str和你作出的猜测字符串gus_str里重复的字符,对解题干扰较大,可以考虑对这两个字符串进行处理:去掉重复的字符;但要注意保持字符串里的字符顺序不变。
即:原来的字符串是:cheese,经过“去重复字符处理”后,应该变为:ches,而不应该变为诸如:cehs 等形式。
下面是自己的代码,AC通过:
#include<stdio.h>
#include<string.h>
#define MAX 1024
char s[MAX],ss[MAX];
char g[MAX],gg[MAX];
void delRe()
{
int count=0;
int i,j,flag;
for(i=0;i<strlen(s);i++)
{
flag=0;
for(j=0;j<count;j++)
if(s[i]==ss[j])
{
flag=1;
break;
}
if(!flag)
ss[count++]=s[i];
}
ss[count]='\0';
count=0;
for(i=0;i<strlen(g);i++)
{
flag=0;
for(j=0;j<count;j++)
if(g[i]==gg[j])
{
flag=1;
break;
}
if(!flag)
gg[count++]=g[i];
}
gg[count]='\0';
}
int main()
{
#ifdef LOCAL
freopen("489_input.txt","r",stdin);
freopen("489_output.txt","w",stdout);
#endif
int roundNum,i,j,k,leftNum,strokeNum,flag;
char str[3][20]={"You win.","You chickened out.","You lose."};
while(scanf("%d",&roundNum)==1&&roundNum!=-1)
{
printf("Round %d\n",roundNum);
scanf("%s\n",s);
scanf("%s\n",g);
delRe();
leftNum=strlen(ss);
strokeNum=0;
for(i=0;i<strlen(gg);i++)
{
flag=0;
for(j=0;j<strlen(ss);j++)
if(gg[i]==ss[j])
flag=1;
if(flag)
{
leftNum--;
if(leftNum<=0)
{
printf("%s\n",str[0]);
break;
}
}
else
{
strokeNum++;
if(strokeNum>=7)
{
printf("%s\n",str[2]);
break;
}
}
}
if(leftNum>0&&strokeNum<7)
printf("%s\n",str[1]);
}
return 0;
}