问题描述:
【题目描述】
刽子手游戏是一款猜单词游戏,计算机想一个单词让你猜,你每次可以猜一字母,如果单词里有那个字母,所有该字母会显示出来。(例如“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;
}