刽子手问题

问题描述:

【题目描述】

刽子手游戏是一款猜单词游戏,计算机想一个单词让你猜,你每次可以猜一字母,如果单词里有那个字母,所有该字母会显示出来。(例如“book”,如果猜字母“o”,则两个o都会显示出来) 如果没有那个字母,则计算机会在一幅“刽子手”画上填一笔。这幅画一共需要7笔就能完成,因此你最多只能错6次。注意,猜一个已经猜过的字母也算错。在本题中,模拟这个过程,输入单词和玩家的猜测,判断结果。

【输入要求】

输入若干组数据,每组数据包含3行,

第1行是游戏编号(-1为输入结束标记),

第2行是计算机想的单词,

第3行是玩家的猜测。后两行保证只含小写字母。

【输出要求】

输出每组对应两行,

第一行为游戏编号,格式为“Round 局数”(无引号,中间有空格),

第二行为游戏结果,

如果玩家获胜,输出"You win.",

如果玩家失败,输出"You lose.",

如果参赛者没有猜到足够的字母就退出,输出"You chickened out."(句末有句点,无引号)

【样例输入】

1
cheese
chese
2
cheese
abcdefg
3
cheese
abcdefgij
-1

【样例输出】

Round 1
You win.
Round 2
You chickened out.
Round 3
You lose.

解决原理:

标记数组

解决方案:

首先对该题目进行分析,本题中只要猜对一个字母就相当于猜对了所有字母,因此我们可以想到利用标记数组对出现的字母进行标记,再用我们猜的字符串与之比较,统计出结果。

首先进行基本的定义:

#include<iostream>
using namespace std;
int main()
{
	string a,b;
	int f[30]={0};
	int la,lb,i,flag,cnt,num;

    return 0;
}

由于本操作多次执行,因此只需要在循环里初始化变量和数组。

接着,由于题目没有给出具体的执行次数,因此我们可以使用while写一个无限循环,在循环内部使用if语句来判断,若输入的num为-1时就跳出循环。需要注意的是不能使用一个cin语句来同时输入num、a和b,因为在结束时-1后面是没有东西的。然后再获取两个字符串的长度,便于后续操作。

    while(1)
	{
		cin>>num;
		if(num==-1)
		{
			break;
		}
		cin>>a>>b;
		la=a.size();
		lb=b.size();
    }

下一步便到了标记。使用for循环将a字符串中所有字符的位置赋为0,存储在f数组中。注意,由于f数组从0开始,因此我们需要在每个a字符串中的字符的后面减去一个‘a’,这样转换过来得到的就是对应的下标了。

接着对cnt和flag变量赋0。

然后是代码的核心部分,首先遍历b字符串,将b字符串中所有字符在f字符串中的位置上的值进行判断,如果是1说明猜对了,因为不能重复猜,所以将该位置赋0;如果是0说明猜错了,cnt++。

        for(i=0;i<la;i++)
		{
			f[a[i]-'a']=1;
		}
		flag=0;
		cnt=0;
		for(i=0;i<lb;i++)
		{
			if(f[b[i]-'a']==1)
			{
				f[b[i]-'a']=0;
			}
			else
			{
				cnt++;
			}
		}

最后我们再处理没有猜完就退出的情况。对f数组进行遍历,如果还有位置上的值为1的,说明没有猜完,将flag赋为1。

对所有情况进行判断,输出即可。别忘了最后将f数组清零!

完整代码实现:

#include<iostream>
using namespace std;
int main()
{
	string a,b;
	int f[30]={0};
	int la,lb,i,flag,cnt,num;
	while(1)
	{
		cin>>num;
		if(num==-1)
		{
			break;
		}
		cin>>a>>b;
		la=a.size();
		lb=b.size();
		for(i=0;i<la;i++)
		{
			f[a[i]-'a']=1;
		}
		flag=0;
		cnt=0;
		for(i=0;i<lb;i++)
		{
			if(f[b[i]-'a']==1)
			{
				f[b[i]-'a']=0;
			}
			else
			{
				cnt++;
			}
		}
		for(i=0;i<26;i++)
		{
			if(f[i]!=0)
			{
				flag=1;
				break;
			}
		}
		cout<<"Round " <<num<<endl;
		if(flag==0&&cnt<7)
		{
			cout<<"You win."<<endl;
		}
		else if(flag==1&&cnt<7)
		{
			cout<<"You chickened out."<<endl;
		}
		else
		{
			cout<<"You lose."<<endl;
		}
		for(i=0;i<26;i++)
		{
			f[i]=0;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值