1014 福尔摩斯的约会 (20 分)

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 AN 表示);后面两字符串第 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. 判断小时的语句中,要在判断完第一个之后,要加入标志,当相同的i的情况下,进入了第一个就不能进第二个if语句
  3. 判断第二个相同的字符的时候,要尽快的退出循环,不然如果后面还有相同的字符的话,会更新掉第二个相同的字符所对应的t的值
  4. 在判断第3句中和第4句中相同的字母的时候,不仅仅小写的字母a ~ z可以,大写的A~Z也是可以的
#include<stdio.h>
#include<string.h>
char time[25]={
	'0','1','2','3','4','5','6','7','8','9',
	'A','B','C','D','E','F','G','H','I','J','K','L','M','N'
}; 
char Day[10][5] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
int Min(int a, int b){
	if(a > b ) return b;
	else return a; 
}
int Lenstr(char str[65]){
	int len = 0;
	while(str[len] != '\n'){
		len++;
	}
	return len;
}
int main(){
	char s1[65], s2[65], s3[65], s4[65];
	int l1, l2, l3, l4;
	fgets(s1,65,stdin);
	l1 = Lenstr(s1);
	s1[l1] = '\0';
	fgets(s2,65,stdin);
	l2 = Lenstr(s2);
	s2[l2] = '\0';
	fgets(s3,65,stdin);
	l3 = Lenstr(s3);
	s3[l3] = '\0';
	fgets(s4,65,stdin);
	l4 = Lenstr(s4);
	s4[l4] = '\0';
	int day,t,m,falg = 0,falg1; 
	for(int i = 0; i < Min(l1,l2); i++){
		if(s1[i] == s2[i] && falg == 0 && s1[i] >= 'A' && s1[i] <= 'G'){
			day = s1[i] - 'A';
			falg = 1;
			falg1 = i;
		}
		if(s1[i] == s2[i] && falg1 != i && falg == 1 && ((s1[i] - '0' <= 9 && s1[i] - '0' >= 0) || (s1[i] -'A' >= 0 && s1[i] - 'A' <= 13))){
			for(int j = 0; j < 24; j++){
				if(time[j] == s1[i]) t = j ;
			}
			falg = 2;
		}
		if (falg == 2) break;		  
	}
	for(int i = 0; i < Min(l3,l4);i++){
		if(s3[i] == s4[i] && ((s3[i] - 'a' >= 0 && s3[i] - 'a' < 26) || (s3[i] - 'A' >= 0 && s3[i] - 'A' < 26))  ) {
			m = i;
			break;
		}
	}
	printf("%s %02d:%02d", Day[day], t, m);
	return 0;
}

参考代码

#include<cstdio>
#include<cstring>
int Min(int a, int b){
	if(a > b ) return b;
	else return a; 
}
int Lenstr(char str[65]){
	int len = 0;
	while(str[len] != '\n'){
		len++;
	}
	return len;
}
int main(){
	char week[7][5] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
	char str1[70],str2[70],str3[70],str4[70];
	fgets(str1,70,stdin);
	int l1 = Lenstr(str1);
	str1[l1] = '\0';
	fgets(str2,70,stdin);
	int l2 = Lenstr(str2);
	str2[l2] = '\0';
	fgets(str3,70,stdin);
	int l3 = Lenstr(str3);
	str3[l3] = '\0';
	fgets(str4,70,stdin);
	int l4 = Lenstr(str4);
	str4[l4] = '\0';
	int i;
	for(i = 0; i < Min(l1,l2); i++){
		if(str1[i] == str2[i] && str1[i] >= 'A' && str1[i] <= 'G'){
			printf("%s ", week[str1[i] - 'A']);
			break;
		}
	}
	for(i++; i < Min(l1,l2); i++){
		if(str1[i] == str2[i]){
			if(str1[i] >= '0' && str1[i] <= '9'){
				printf("%02d:",str1[i] - '0');
				break;
			}else if(str1[i] >= 'A' && str1[i] <= 'N'){
				printf("%02d:",str1[i] -'A' + 10);
				break;
			}
		}
	}
	for(i = 0; i < Min(l3,l4); i++){
		if(str3[i] == str4[i]){
			if((str3[i] >= 'A' && str3[i] <= 'Z') || (str3[i] >= 'a' && str3[i] <= 'z')){
				printf("%02d",i);
				break;
			}
		}
	}
	return 0;
}