基于HustOJ一道题的思考

【题目描述】

今天的英语课,王老师为了复习以前学过的单词,提高学生的学习兴趣,想了一个主意:

(1)把全班分为n个小组,每个小组写一个学过的单词(均为小写)和一个整数k;

(2)每个小组根据该单词中每个字母的字典顺序上推或下推k个位置,经过变换后得到一个新单词。推移规则是:如果k为正数则下推,否则上推,当推移超越边界时回到另一端继续推移。例如,单词为at,k=8则新单词为ib,字母t下移到边界z还不够,则再从第一个字母a开始继续推移。

(3)每个小组把得到的新单词和整数k展示到黑板上;

(4)王老师紧接着给出了一个字母,规定哪个小组最快完成以下任务则获胜:统计出该字母在所有小组开始写出的单词中出现的次数。

你能编程帮助贝贝所在的小组获胜吗?

【输入】

输入文件共n+2行:

第1行为王老师给出的一个字母;

第2行为数字n(2≤n≤30),表示全班分为n个小组;

接着是n行,每行为每个小组得到的新单词(2≤单词长度≤14),然后空一个格,后接一个整数k(-1000≤k≤1000)。

【输出】

输出文件只有一个数,为给定字母在所有小组开始写出的单词中出现的次数。

【样例输入】

e
2
welcome -2
happy 3

【样例输出】

2

【我的代码】

(白盒测试未通过,WA报错,有一个应该输出3,实际输出4)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char teacher;
	scanf("%c",&teacher);
	int n,count=0;
	scanf("%d",&n);

	char s[100][100];
	int x;

	for (int i=0; i<n; i++)
	{
		scanf("%s%d",s[i],&x);

		for (int j=0; j<strlen(s[i]); j++)
		{
			if (s[i][j]==teacher)
				count++;
		}
	}

	printf("%d\n",count);

	return 0;
}

 

【基于题目的思考】

这道题描述很长,但是实际用到的东西并不多,只是统计初始时和老师给出的字符相同的字符个数,如果改为变化之后,题目的难度和趣味便又增加了不少。

下面给出我对修改后题目的参考代码实现(未进行黑盒测试)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char teacher;
	scanf("%c",&teacher);
	int n,count=0;
	scanf("%d",&n);

	char s[100][100];
	int x;

	for (int i=0; i<n; i++)
	{
		scanf("%s%d",s[i],&x);

		//整出一个新的单词
		for (int j=0; j<strlen(s[i]); j++)
		{
			s[i][j]+=x;
			if (s[i][j]>122)
				s[i][j]-=26;
			if (s[i][j]<97)
				s[i][j]+=26;
		}


		//遍历新的字符数组寻找老师要求的内容
		for (int j=0; j<strlen(s[i]); j++)
		{
			if (s[i][j]==teacher)
				count++;
		}

	}

	printf("%d\n",count);

	return 0;
}

不知道这样的设计是否合理,欢迎各位在评论区给予指点,谢谢!

分享