地址:https://www.luogu.org/problem/UVA489
一开始理解错题意了……wa了好久
其实我们不用这么复杂,一步一步去模拟。观察一下,每猜中一个字母都会把所有字母给显示出来,那么我们可不可以把问题转化为,计算机给出的单词中有多少种不同的字母,而猜的序列中又有没有这些字母并满足题目要求)
所以我们的任务就是检索一遍猜的序列,看有没有计算机给出的单词的字母。有的话就统计起来(用num代替),计算机给出的字母用sum代替,如果最后sum==num,那就证明任务完成,可以结束了。当sum!=num且wa(猜错的次数)<7时,我们就认为他是没有完成任务的(可以自己想想)。这个题目有一个坑点,就是当你已经完成任务是,后面还有一大堆错的时候
(例如:
a
jefihaiefj )这样的数据,你也得输出win。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int n,wa,ji[10005],num,sum;//ji数组是统计有没有重复猜某些字母
char s1[10005],s2[10005];
bool z1[10005],z2[10005],flag,tong;//z1就是计算机给出了哪些字母,z2就是你猜了哪些字母
int main()
{
//freopen("123.txt","w",stdout);
S1: while(scanf("%d",&n)&&n!=-1)
{
sum=num=0;
wa=0;
printf("Round %d\n",n);
memset(s1,0,sizeof(s1));
memset(z1,false,sizeof(z1));
memset(z2,false,sizeof(z2));
memset(ji,0,sizeof(ji));
flag=true;
memset(s2,0,sizeof(s2));
scanf("%s%s",s1+1,s2+1);
for(int i=1;i<=strlen(s1+1);i++)
{
if(z1[s1[i]-'a'+1]==false)sum++;
z1[s1[i]-'a'+1]=true;
}
for(int i=1;i<=strlen(s2+1);i++)//无论猜没猜对都要统计已经猜过的字母哦
{
if(wa>=7)break;//wa>=7就已经可以结束了
if(ji[s2[i]-'a'+1]!=0)
{
wa++;
continue;
}
if(z1[s2[i]-'a'+1])//如果猜的序列出现过某些字母,就统计下来吧
{
ji[s2[i]-'a'+1]++;
num++;
}
else
{
ji[s2[i]-'a'+1]++;
wa++;
}
if(sum==num)//这里就是我前面说的要注意的点,每一步检索都要判断一次,防止踩陷阱
{
printf("You win.\n");
goto S1;
}
}
if(sum!=num&&wa<7)printf("You chickened out.\n");
else
{
if(wa>=7)
{
printf("You lose.\n");
}
else
{
printf("You win.\n");
}
}
}
}