本文主要是介绍例题4-2 刽子手游戏 UVa489,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
算法竞赛入门经典(第2版)第4章 函数和递归
例题4-2 刽子手游戏 UVa489
感悟。
1、阅读书中题目,从网站下载英文原题,对比阅读。
2、对书中“猜一个已经猜过的字母也算错”,心存疑虑,反复研读英文原题,查找求证。
此句本人的理解是,答案中的字母一旦被猜中,该字母就被从答案中剔除出去,该字母就不在存在于答案中了,正好印证“猜一个已经猜过的字母也算错”。
3、思路流畅,编写出了写笔误,但通过跟踪很快纠正,提交WA。
4、重新测试,样例全部通过,哪出了问题?
5、翻书,看了程序4-11,大受启发,猜测一个字母马上判断一次,而作者的代码是对所有的猜测字母进行判断。
1
cheese
cheesecheesecheese
You lose.
以上是作者之前的程序输出,重改代码后,
1
cheese
cheesecheesecheese
You win.
6、提交代码AC。之前代码是对输入猜测数据一股脑统计,之后代码是对输入猜测数据,猜一个验证一个,后者跟真实的游戏过程是相一致的。
附上代码
环境Dev-cpp4.9.9.2
#include <stdio.h>
#include <string.h>
char a[1000],g[1000];//储存字符串
int abook[26],gbook[26];//标记26个字母出现频率
int main(){
int k;
int alen,glen;
int i;
int j;
int suc,fau;
int acount;
while(scanf("%d",&k)==1&&k!=-1){
scanf("%s%s",a,g);
memset(abook,0,sizeof(abook));
memset(gbook,0,sizeof(gbook));
alen=strlen(a);
glen=strlen(g);
for(i=0;i<alen;i++)//统计答案字母频率
abook[a[i]-'a']++;
acount=0;
for(i=0;i<26;i++)
if(abook[i])//统计答案的字母组成个数(扣除雷同字母)
acount++;
suc=0;//猜对次数
fau=0;//猜错次数
for(i=0;i<glen;i++){//以猜测字母为基准进行扫描
j=g[i]-'a';
if(abook[j]==0){//答案无此字母,猜测错误
fau++;
if(fau==7)//彻底失败
break;
}else if(abook[j]!=0){//猜中字母
suc++;
abook[j]=0;//将此字母从答案中剔除出去,此句比较关键
if(suc==acount)//成功
break;
}
}
printf("Round %d\n",k);
if(fau>=7)//猜错7次及以上
printf("You lose.\n");
else if(suc==acount)//全部猜对
printf("You win.\n");
else
printf("You chickened out.\n");
}
return 0;
}
这篇关于例题4-2 刽子手游戏 UVa489的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!