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