【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

首先理解题意:
  1.前两个字符串包含星期和小时两个信息,首先,两个字符串在同一位置有相同的大写字母代表了星期的信息,且大写字母在A-G之间;
  2.在表示星期的大写字母的后面,再找相同的字符(包含大写字母A-N,和数字0-9),,这个字符代表了小时的信息,例如:
YN6aBcmZD8oNp6
Yh6aBdmZg8lN
    1)先找相同的大写字母,得到B,表示星期二,其中,第一个位置的Y虽然相同,但不在A-G之间,大写字母B之前的6和a也不满足);
    2)再在B之后找相同的字符,得到8,表示08点,其中m虽然相同,但不是大写字母,大写字母Z不在A-N之间,在8后面的N虽然也满足条件,但已经确定了时间为08点,则N应该舍弃
      注意在时间小于10(0-9)的时候,打印时间时前面需补0
  3.在后两个字符串中确定了分钟的信息,需要找到相同的英文字母所在的位置(大写和小写字母均可),同样只取第一个满足条件的字符所在的位置,打印时不足两位的同样需要补0


程序说明:
  1.确定需要比较的两个字符串中较短的字符串长度,再进行比较;
  2.判断一个字符ch是不是大写字母的三种方法:
isupper(ch);//是大写字母返回非零值(true),否则返回零(false)
if(ch>='A'&&ch<='Z');
if(ch>=65&&ch<=90);//65和90分别为A和Z对应的ASCII码值 
  3.判断一个字符ch是不是小写字母的三种方法:
islower(ch);//是小写字母返回非零值(true),否则返回零(false)
if(ch>='a'&&ch<='z')
if(ch>=97&&ch<=122)//97和122分别为a和z对应的ASCII码值 
  4.判断是否是字母用 isalpha(ch),若是,返回非零值(true),否则返回零(false)
   判断是否是数字用 isdigit(num),若是,返回非零值(true),否则返回零(false)
**注意:上面提到的 isupper()、islower()、isdigit()、isalpha()均为宏定义,非真正的函数
  5.在多余位置上补0的方法:
cout<<setw(n)<<setfill('0')<<i;
    setw(n)表示设置位宽为 n,如果不进行设置,系统默认左对齐输出,设置后为右对齐,空出的位置以空格填充
    setfill('0')表示以单个字符'0'填充空余位置,注意:setfill()中参数只能为单个字符,setfill(0)或者 setfill("0")均报错
    i 为输出项

C++代码如下:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int min(int a,int b){
 4     if(a<b) return a;
 5     else return b;
 6 }
 7 int main() {
 8     char str[4][60];
 9     int count=0;
10     string week[7]={"MON ","TUE ","WED ","THU ","FRI ","SAT ","SUN "};
11     cin>>str[0]>>str[1]>>str[2]>>str[3];
12     int len0,len2;
13     len0=min(strlen(str[0]),strlen(str[1]));
14     len2=min(strlen(str[2]),strlen(str[3]));
15     for(int i=0;i<len0;i++){
16         if(str[0][i]==str[1][i]){
17             if(count==0){    
18                 if(str[0][i]>='A'&&str[0][i]<='G'){                
19                     cout<<week[(str[0][i]-'A')];
20                     count++;
21                 }
22             }
23             else if(count==1){
24                 if(str[0][i]>='A'&&str[0][i]<='N'){                
25                     cout<<(10+(str[0][i]-'A'))<<':';
26                     break;
27                 }
28                 else if(isdigit(str[0][i])){
29                     cout<<setw(2)<<setfill('0')<<str[0][i]<<':';
30                     break;
31                 }
32             }                        
33         }
34     }
35     for(int i=0;i<len2;i++){
36         if(str[2][i]==str[3][i]){
37             if(isalpha(str[2][i])){            
38                 cout<<setw(2)<<setfill('0')<<i;
39                 break;
40             }
41         }
42     }
43     system("pause");    
44     return 0;
45 }
posted on 2018-04-26 15:50  Pink.Pig  阅读(624)  评论(0编辑  收藏  举报