uva 489

地址: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");
			}
		}
	}
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章