PAT乙级1014. 福尔摩斯的约会(20)

1014. 福尔摩斯的约会(20)
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母'D',代表星期四;第2对相同的字符是'E',那是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、以及大写字母A到N表示);后面两字符串第1对相同的英文字母's'出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
输入格式:
输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。
输出格式:
在一行中输出约会的时间,格式为“DAY HH : MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。
输入样例:
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
输出样例:

THU 14:04

分析:这道题的表述真的很不清楚,题目里说的字母相同必须是位置也相同,然后day的范围是A~G,hour的范围是A~N和0~9,minute的范围是a~z和A~Z

我们可以用两个for循环来做,第一个for循环找出day,然后continue,找出hour。第二个for循环找出minute。

#include
#include
using namespace std;
int main()
{
	string s1, s2, s3, s4;
	cin >> s1 >> s2 >> s3 >> s4;
	int i, j;
	int flag_day = 0;//用来标记是否已经找出了day,找出了就置1,没找出就是0
	for (i = 0; i < s1.length(); i++)//第一个for循环找day和hour
		
		if (s1[i] == s2[i])//如果字母相同
		{
			if (flag_day == 0)//如果flag_day还是0表示第一对相同字母还没找到
				if (s1[i] <= 'G'&&s1[i] >= 'A')//找出day
				{switch (s1[i])
					{
					case 'A':cout << "MON "; break;
					case 'B':cout << "TUE "; break;
					case 'C':cout << "WED "; break;
					case 'D':cout << "THU "; break;
					case 'E':cout << "FRI "; break;
					case 'F':cout << "SAT "; break;
					case 'G':cout << "SUN "; break;
					}
				flag_day = 1;//把flag_day置1,表示day找到了
				continue;//继续循环
				}
			if (flag_day == 1)//flag_day是1表示接下来该找第二对相同字母了
			{
				if (s1[i] <= '9'&&s1[i] >= '0')//如果是0~9
				{
					cout << "0" << s1[i] - '0' << ":";//凑齐两位数
					break;
				}
				if (s1[i] <= 'N'&&s1[i] >= 'A')//如果是A~N
				{
					cout << 10 + s1[i] - 'A' << ":";
					break;//退出循环
				}
			}
		}//第一个for循环结束
			
	for (i = 0; i < s3.length();i++)//第二个for循环用来找出minute
		if (s3[i] == s4[i])
			if (s3[i] <= 'Z'&&s3[i] >= 'A'|| s3[i] <= 'z'&&s3[i] >= 'a')
				{
					cout.fill('0');//凑齐2位,前面补0
					cout.width(2);
					cout << i;
					return 0;
				}
}


你可能感兴趣的:(PAT乙级题目部分解析,PAT乙级解析)