PAT乙级1014 福尔摩斯的约会
时间:2023-03-13 06:30:00
1014 约会福尔摩斯
福尔摩斯侦探收到了一张奇怪的纸条:让我们约会吧!
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm。
大侦探很快就明白了,字条上奇怪的乱码其实是周四约会的时间 14:04,因为前两个字符串是第一个 1 相同的大写英文字母(大小写有区别)是第一个 4 个字母 D,代表周四;第 2 相同的字符是 E ,那是第 5 英文字母,代表一天中的第一个 14 所以一天 0 点到 23 点由数字 0 到 以及大写字母 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
其实这个问题有点难,我在PTA上面发现通过率不高,只有16.36%,所以写一个小问题
这个问题的难点是有很多边界条件和隐藏条件,所以很容易判断错误。我在代码中写了一个更详细的注释,应该可以通过代码直接窥视豹获得想法。
代码如下:
#include #include #include /* 这个问题是迄今为止最阴险的问题,有很多边界条件和隐含条件。 如果不是靠网上测试案例慢慢测试补充bug,我可能一辈子都找不到我。bug和这些隐藏条件 */ using namespace std; int main(){ vectorcharacter; vector::iterator it; char n[3]; ///两个用于存储输入字符string类型 string sentence1,sentence2; ///这里定义的一个bool其实类型是为了防止‘’N以后的字符作为第一个元素直接压入栈中 bool flag = false; cin>>sentence1>>sentence2; for(int i=0;i='A'&&sentence1[i]<='G'&&flag == false){ character.push_back(sentence1[i]); ///读完第一个元素后,就把flag变成1,即现在允许读入第二对字符 flag = true; } //第二对字符必须从‘0’到‘’N这一点需要注意。一开始,我可以把它当作所有的字符,就会出错 else if(flag == true&&sentence1[i]<='N'&&sentence1[i]>='0'){ character.push_back(sentence1[i]); break; } } } cin>>sentence1>>sentence2; for(int i=0;i='A'&&sentence1[i]<='z'){ character.push_back(i); break; } } ///这是把vector中间元素赋予数组,便于后续输出 it = character.begin(); for(int i=0;i<3;i ){ n[i] = *it; it ; } ///判断一周switch switch(n[0]){ 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; default: break; } ///这里的字符需要分为情况,从‘0’到‘9’A'到'Z需要分开处理的处理方法不同 if(n[1]>='0'&&n[1]<='9') ///需要改为C语言风格输出,以便更改格式。如果这里不这样输出,就没有前0 printf("d",n[1]-0; else if(n[1]>='A'&&n[1]<='Z') ///这里加10是因为需要便宜的操作,A实际上是10 cout<
C语言福尔摩斯约会(OJ题)附测试用例 输出结果 思路解释_java_leading的博客-CSDN博客
附上CSDN上面看到的测试用例,用这个慢慢把握bug找出来的
测试一:
3469djDkxh4hhG0
2974dlDfkkkkgg0dsb
s&hgfdkiggggs
d&Hycvnmzzzzs
输出:
THU 00:12
测试二:
IcCO2eA
IcCO2eB
cCaseC
cCaseD
输出
WED 02:00
测试三:
6985djEkxh4hhGE
2984adEfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
输出:
FRI 14:04
测试四:
3485djGkxh4hhG2
2984akGfkkkkgg2dsb
s&hgsfdk
d&hyscvnm
输出:
SUN 02:02
测试五:
3485djDkxh4hhG82984akDfkkkkggEdsb
2984akDfkkkkgg8da
s&hgsfdk
d&Hyscvnm
输出:
THU 08:04