1. 程式人生 > >【PAT】1014. 福爾摩斯的約會 (20)

【PAT】1014. 福爾摩斯的約會 (20)

mco using ace 奇怪 星期六 tps ble set 字母

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 }

 



【PAT】1014. 福爾摩斯的約會 (20)