1. 程式人生 > >1014 福爾摩斯的約會 字串的操作

1014 福爾摩斯的約會 字串的操作

1014 福爾摩斯的約會 (20)(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
作者: CHEN, Yue
單位: PAT聯盟
時間限制: 100ms
記憶體限制: 64MB
程式碼長度限制: 16KB

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
  map<int,string> day;
  day[1]="MON"; day[2]="TUE";day[3]="WED";day[4]="THU";    //設定的對映map,當然也可以用字元陣列來實現
  day[5]="FRI";day[6]="SAT";day[7]="SUN";
  string str1,str2,str3,str4;
  cin>>str1>>str2>>str3>>str4;        //讀入四個字串
int flag=0; //用於標記是否已經輸出了日期 for(int i=0;i<str1.length();i++){ if(!flag && str1[i]==str2[i] && str1[i]>='A' && str1[i]<='G'){ //還沒有輸出日期,並且相同位置是相同的A~ Z內的相同字母 cout<<day[str1[i]-'A'+1]<<' '; //求得在字母表中的序號,然後輸出日期。記得空格 flag=1; //標記置為1. } else if(flag && str1[i]==str2[i]){ //已經輸出了日期,選擇開始確定小時 if(str1[i]>='A' && str1[i]<='N'){ cout<<str1[i]-'A'+10<<':'; //如果是A~N內的, str1[i]-'A'+1+9 break; //要及時跳出迴圈,因為後面可能還有滿足條件的。在輸出就多餘了 } else if(str1[i]>='0'&&str1[i]<='9'){ cout<<'0'<<str1[i]<<':'; //不滿足兩位數,記得補零 break; } } } for(int i=0;i<str3.length();i++){ //確定分鐘 if(str3[i]==str4[i]){ if((str3[i]>='a'&& str3[i]<='z')||(str3[i]>='A'&& str3[i]<='Z')){ //要是英文字母才行 if(i<10)cout<<'0'<<i; //補零 else cout<<i; //正常輸出。 } } } } /*注意點:1.確當周幾的字母是A~G,所以遍歷字串的時候,第一個和第二個字串的相同位置字母不僅一樣,還要是A~G內的 2.確定小時的字元是在滿足1條件的字母的位置(因為兩個字串第一個相同的字元是8,但題目的陳述的是E,這是隱含資訊)後面查詢,範圍0~9和A~N以內,字母是看它在字母表中的位置,A的位置為1。 3.兩個字串中相同位置具有相同字母的對數不止兩對,所以在確定小時候一定要跳出迴圈,不然後面還可能又有一對滿足2的,這就錯誤了,有一個測試點的陷阱就在這裡。 4.最後兩個字串中確當分鐘的是英文字母A~Z 以及a~z,在字串的相對位置(從零開始計數)。 5.小時或者分鐘不滿足兩位的要記得補零。*/