算法竞赛入门经典(第二版) | 例题4-2 刽子手游戏 (UVa489,Hangman Judge)

大家站在出题者的角度考虑,我们出了一道大水题,会让它又臭又长或是用复杂的函数吗? 不会。所以做这种题千万不要想得太复杂。循环+数组足矣。


提目(提交)链接→UVa-489
百度翻译→百度翻译
没使用过该网站的同学请猛戳这里→vJudge教程


输入输出规则

按题给句子输出即可,每个输出之间没有空行。

测试规则

1.错7次则lose。
2.猜一个已经猜过的(无论是正确的还是错误的字母),都算错。
3.若已经全部猜出,之后即使乱输入使得错误大于7次,也算win。

分析:

按ASIⅡ定义a[127]与b[127],赋0,遍历输入,若a数组角标=正确单词中字母的ASIⅡ,则将此数组值赋1。
正确单词存入a数组后,输入猜测序列,用b数组表示,若b数组角标=a数组角标,则计数器sum1++;若不等于,或重复输入,则sum2++;
最后,
如果sum1=a数组不重复元素个数,则赢。
若sum2 >= 7 则输
若sum2 < 7 则弃权。

代码:
#include 
#include  
using namespace std ;
int main() {
	int a[130], b[130]; 							//答案、输入数组 
	int i;											//计数器 
	while((cin>>i) && (i != -1)) {					//少定义一个i变量,利用a数组空余空间赋值 	
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));						//赋0。 
		char c;
		int k1 = 0 ;								//正确单词无重复的个数 
		int k2 = 0 ;								//计数器
		//输入: 
		getchar() ;									//吸收1之后的回车。 
		while((c = getchar()) && (c != '\n')) 		//输入a数组 
			if(a[c] == 0 ) {
				a[c]++; k1++; 						
			}
		int num = 0;
		while((c = getchar()) && (c != '\n')) {
			b[c]++;
			if((a[c] == b[c]) && (a[c] <= 1) && (num < 7 )) { 	//若有正确答案的字母且之前没输入过 
				a[c]++; k2++; 
			}	
			else  num++ ;  
		}
		//输出
		cout << "Round" << ' ' << i << endl ; 
		if(k1 == k2)  cout << "You win." << endl;
		else if(num >= 7) cout << "You lose." << endl;
		else if(num < 7) cout << "You chickened out." << endl ;
	}
	return 0 ; 	
}
收获:

1、本题运用了两个算法:查表、在线处理。
2、在动键盘之前,要总结出该题的输入输出格式测试规则悔棋很麻烦的!


最后分享一条大牛的建议(对笔者受益匪浅):算法最好有人带着学,如果条件不允许,一定要到网络上广泛交流、学习。

你可能感兴趣的:(算法竞赛与入门经典,函数和递归,c++)