UVa_OJ 489 刽子手的游戏

本文介绍了一种猜字游戏的算法实现,通过去除字符串中的重复字符并保持原有顺序,优化了猜字过程。该算法确保猜对的字符一次性全部识别,并避免了重复计算错误次数,实现了游戏逻辑。

这道题的大意这样的:

给定一个小写字符串str,要求你对它进行猜测,每次只能猜一个字符,如果你猜的这个字符在str中,那么此次猜测正确,并且所有在str里的相同字符都算作猜对;如果你猜的这个字符不在str中,那么此次猜测错误,猜错次数+1。如果在猜错次数达到7次(或:>=7次)时,你还没有完全猜出str里的所有字符,那么“You lose.”;如果在猜错次数达到7次之前,你已经完全猜出str里的所有字符,那么"You win.";如果在猜错次数达到7次之前,你没有完全猜出str里的所有字符,那么"You chickened out."。

其中需要注意两点:

1,如果你猜的字符,在str中,那么str里所有相同的字符都被算作猜对;

2,同样猜错的字符,只算作猜错一次(不重复计算)。


个人解题思路参考:

根据此题的题意和上面的两点注意,可以发现,给出的猜测字符串str和你作出的猜测字符串gus_str里重复的字符,对解题干扰较大,可以考虑对这两个字符串进行处理:去掉重复的字符;但要注意保持字符串里的字符顺序不变。

即:原来的字符串是:cheese,经过“去重复字符处理”后,应该变为:ches,而不应该变为诸如:cehs 等形式。

下面是自己的代码,AC通过:

#include<stdio.h>
#include<string.h>
#define MAX 1024
char s[MAX],ss[MAX];
char g[MAX],gg[MAX];
void delRe()
{
	int count=0;
	int i,j,flag;
	for(i=0;i<strlen(s);i++)
	{
		flag=0;
		for(j=0;j<count;j++)
			if(s[i]==ss[j])
			{
				flag=1;
				break;
			}
		if(!flag)
			ss[count++]=s[i];
	}
	ss[count]='\0';
	count=0;
	for(i=0;i<strlen(g);i++)
	{
		flag=0;
		for(j=0;j<count;j++)
			if(g[i]==gg[j])
			{
				flag=1;
				break;
			}
		if(!flag)
			gg[count++]=g[i];
	}
	gg[count]='\0';
}


int main()
{
	#ifdef LOCAL
	freopen("489_input.txt","r",stdin);
	freopen("489_output.txt","w",stdout);
	#endif
	int roundNum,i,j,k,leftNum,strokeNum,flag;
	char str[3][20]={"You win.","You chickened out.","You lose."};
	while(scanf("%d",&roundNum)==1&&roundNum!=-1)
	{
		printf("Round %d\n",roundNum);
		scanf("%s\n",s);
		scanf("%s\n",g);
		delRe(); 
		leftNum=strlen(ss);
		strokeNum=0;
		for(i=0;i<strlen(gg);i++)
		{
			flag=0;
			for(j=0;j<strlen(ss);j++)
				if(gg[i]==ss[j])
					flag=1;		
			if(flag)
			{
				leftNum--;
				if(leftNum<=0)
				{
					printf("%s\n",str[0]);
					break;
				}
			}
			else
			{
				strokeNum++;
				if(strokeNum>=7)
				{
					printf("%s\n",str[2]);
					break;
				}
			}
		}
		if(leftNum>0&&strokeNum<7)
			printf("%s\n",str[1]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值