【PAT乙级】【C++】 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。
  3. 对比第三个和第四个字符串,任何大小写字母只要相对应了那就符合条件,可获得字符下标。

代码:

#include 
#include 
#include 
#include 
using namespace std;

int main(){
     
    char s1[1000];
    char s2[1000];
    char s3[1000];
    char s4[1000];
    char jilu[100];	//记录天,时
    cin>>s1>>s2>>s3>>s4;	//依次输入四个字符串,采用char
    
    /*minlen是在s1和s2中获取最小字符串的长度,k作为jilu[]数组的有效长度,
    temp则代表着记录符合第一对大写字母的字符下标,在记录第二对字符有很大的作用*/
    int minlen = min(strlen(s1),strlen(s2)), k = 0, temp = 0;
    for(int i = 0;i<minlen; i++){
     
        if(s1[i]==s2[i]&&s1[i]>='A'&&s1[i]<='G'){
     
            jilu[k++] = s1[i];//符合条件时,用jilu数组把字符记录
            temp = i;	//同时把该字符的下标传给temp
            break;	//记得break!
        }
    }
    for(int i = temp+1;i<minlen; i++){
     	//在temp+1处开始判断,找到第二对字符
        if(s1[i]==s2[i]&&((s1[i]>='0'&&s1[i]<='9')||(s1[i]>='A'&&s1[i]<='N'))){
     
            jilu[k] = s1[i];//符合条件,用jilu数组记录
            break;	//记得break!
        }
    }
    int day = jilu[0]-'A'+1;	//计算天
    int hour = 0;	//初始化小时
    //计算小时
    if(jilu[1]>='A'&&jilu[1]<='N')	//如果第二对字符是字母的话
        hour = 10+(int)(jilu[1]-'A');	//就进行计算,这里实质是(int)(jilu[1]-'A')+9+1
    else //否则就是数字
        hour = jilu[1]-'0';	//直接传过去
        
    int mlen = min(strlen(s3),strlen(s4)), t = 0;
    for(int i = 0;i<mlen; i++){
     
        if(s3[i]==s4[i]&&((s3[i]>='A'&&s3[i]<='Z')||(s3[i]>='a'&&s3[i]<='z'))){
     
            t=i;	//如果符合条件,那么就传字符的下标
            break;
        }
    }
    //用switch来实现,也可以用map键值对实现
    switch(day){
     
        case 1:
            cout<<"MON"<<" ";
            break;
        case 2:
            cout<<"TUE"<<" ";
            break;
        case 3:
            cout<<"WED"<<" ";
            break;
        case 4:
            cout<<"THU"<<" ";
            break;
        case 5:
            cout<<"FRI"<<" ";
            break;
        case 6:
            cout<<"SAT"<<" ";
            break;
        case 7:
            cout<<"SUN"<<" ";
            break;
    }
    //记得前导0,为两个,所以用%02d
    //这边用printf会比cout方便一点
    printf("%02d:%02d\n",hour,t);
}

你可能感兴趣的:(PAT乙级)