题意:
题目很长,自己看吧,说几个注意点:
1、如果猜的字不合法(长度不等于5或者有小写字母),则输出上次猜字的结果。(第一次猜字的结果就是原字符串第一个字+"....")
2、如果超过5次没猜出来或者输入结束,用小写字母输出原字符串
3、如果5次之内猜出,则不处理下面的数据(照常读入)
然后测试数据有个bug,第一行有一个空行。。
代码:
1# include <cstdio>
2# include <cstring>
3using namespace std;
4bool illegal(char *str)
5{
6 if(strlen(str)>5) return true;
7 for(int i=0;i<5;i++)
8 if(str[i]<'A'||str[i]>'Z')
9 return true;
10 return false;
11}
12int main()
13{
14 //freopen("ans.txt","w",stdout);
15 char ori[10];
16 while(gets(ori))
17 {
18 if(!strlen(ori)) continue;
19 if(!strcmp(ori,"LINGO")) break;
20 puts("");
21 int used[26];
22 memset(used,0,sizeof(used));
23 for(int i=0;i<5;i++) used[ori[i]-65]++;
24 char last[10];
25 strcpy(last,ori);
26 for(int i=1;i<5;i++) last[i]='.';
27 puts(last);
28 bool find=false;
29 int count=0;
30 while(true)
31 {
32 char res[10],str[128];
33 res[5]='\0';
34 gets(str);
35 if(!strlen(str)) break;
36 if(!find&&count<5)
37 {
38 if(illegal(str)) puts(last);
39 else
40 {
41 int c[26];
42 memcpy(c,used,sizeof(used));
43 for(int i=0;i<5;i++)
44 if(str[i]==ori[i])
45 c[str[i]-65]--,res[i]=str[i];
46 for(int i=0;i<5;i++)
47 if(str[i]!=ori[i]&&c[str[i]-65]>0)
48 c[str[i]-65]--,res[i]=str[i]+32;
49 else if(str[i]!=ori[i])
50 res[i]='.';
51 strcpy(last,res);
52 puts(res);
53 if(!strcmp(str,ori)) find=true;
54 }
55 count++;
56 }
57 }
58 if(!find)
59 {
60 for(int i=0;i<5;i++) ori[i]+=32;
61 puts(ori);
62 }
63 }
64 return 0;
65}
66