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;
}

浙公网安备 33010602011771号