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

| 代码长度限制 | 时间限制 ||内存限制 |
|16 KB | 200 ms | 64 MB |

思路:按照题目的意思来,一共输入四个字符串
①先找到前两个字符串中第一个相同的大写字母,肯定是A~G中的某一个,对应于MON(星期一) ~ SUN(星期日)
②再找到前两个字符串中第二个相同的字符,可能是数字0~9(对应一天的0时 ~ 9时),也可能是A ~ N(对应一天中的10时 ~ 23时)
③再确定后两个字符串中第一个相同的字母的位置(从0开始),记录下来,代表第几分钟
④用两个map分别存储①和②中找到的字符及其对应的时间标志,便于输出
⑤最后用scanf对输出进行精确控制,如果输出的时间不足2位数要在前面添0,用%02d表示

代码:

#include<bits/stdtr1c++.h>
using namespace std;
int cnt1 = 1, flag = -1;
int main() {
	string s1, s2, s3, s4;
	vector<char> v;
	cin >> s1 >> s2 >> s3 >> s4;
	for (int i = 0; i < int(s1.size()); i++) {
		if (cnt1 == 1) {
			if (s1[i] == s2[i] && s1[i] >= 'A' && s1[i] <= 'G') {
				v.emplace_back(s1[i]); //找到第一个相同大写字母并存入vector
				cnt1++;
			}
		} else if (cnt1 == 2) {
			if ((s1[i] == s2[i] && s1[i] >= 'A' && s1[i] <= 'N') || (s1[i] == s2[i] && isdigit(s1[i])) ) {
				v.emplace_back(s1[i]);  //找到第二个相同字符并存入vector,上面的isdigit()函数用于判断单个字符是否是数字
				break;  //此时cnt1为2,表示前两个部分以经找到,可以跳出去找第三个了
			}
		}
	}
	for (int i = 0; i < int(s3.size()); i++) {
		if (s3[i] == s4[i] && isalpha(s3[i])) {
			flag = i;  //标记后两句中第一个相同的字符的位置,上面的isalpha()函数用于判断单个字符是否是数字或英文字母
			break;  //找到了就直接跳出
		}
	}
	map<char, string> mp1 = {{'A', "MON"}, {'B', "TUE"}, {'C', "WED"},
		{'D', "THU"}, {'E', "FRI"}, {'F', "SAT"}, {'G', "SUN"}
	};  //建立第一部分关于星期几的映射
	map<char, int> mp2 = {{'A', 10}, {'B', 11}, {'C', 12},
		{'D', 13}, {'E', 14}, {'F', 15}, {'G', 16}, {'H', 17},
		{'I', 18}, {'J', 19}, {'K', 20}, {'L', 21}, {'M', 22}, {'N', 23}
	};  //建立第二部分关于小时的映射
	if (v[1] >= '0' && v[1] <= '9')
		printf("%s %02d:%02d", mp1[v[0]].c_str(), v[1] - '0', flag);  //输出时用c_str()可将string类型转成char[]类型用%s输出
	else
		printf("%s %d:%02d", mp1[v[0]].c_str(), mp2[v[1]], flag);
	return 0;
}
posted @ 2022-08-10 00:57  Fare-Well  阅读(42)  评论(0)    收藏  举报