地址: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");
}
}
}
}