您的位置:首页 > 其它

【PAT乙级题目1014】福尔摩斯的约会

2017-03-17 16:57 337 查看

福尔摩斯的约会

题目描述:

大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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

个人总结:理解题目出错。题目的意思其实是两个字符串的上下每一位相对应,判断相同然后输出该字符;而我理解成第一行中的某个字母和下一行的任意一个位置的字母相同。当然这样的想法加大了题目的难度,但最后也还是实现了这样一种思路。即当比较出来第一对相同大写字母的同时,记录c[0]和c[1]查找到的位置(利用全局变量),第二次查找时(即判断小时),刚好跳过了第一次查找相同的位置。

#include<stdio.h>
int i=0;
char  data(char c[][60]);
int  data2(char c[][60]);
char  data3(char c[][60],int g);
int main(){
int n,date2;
int g=0;
char c[4][60];
for(int m=0;m<4;m++){
gets(c[m]);
}
char date = data(c);
int date1=date-64;
if(date1==1)printf("MON ");
if(date1==2)printf("TUE ");
if(date1==3)printf("WED ");
if(date1==4)printf("THU ");
if(date1==5)printf("FRI ");
if(date1==6)printf("SAT ");
if(date1==7)printf("SUN ");
i++;

for(;c[1][g]!='\0';g++){
if(c[1][g]==date)
break;
}
g++;

char datee = data3(c,g);

if(datee>=48&&datee<=57)
{
date2=datee-48;
}else{
date2=datee-64+9;
}

printf("%d:",date2);
int dateee =data2(c);
if(dateee/10==0){
printf("0");
}
printf("%d",dateee);

return 0;
}
char  data(char c[][60]){
for(;;i++){
if(c[0][i]>=65&&c[0][i]<=90){
for(int j=0;c[1][j]!='\0';j++){
if(c[0][i]==c[1][j])
return c[0][i];
}
}
}
return 0;
}

char  data3(char c[][60],int g){
for(;;i++){
if(c[0][i]>=48&&c[0][i]<=57){
for(int q=g;c[1][q]!='\0';q++){
if(c[0][i]==c[1][q])
return c[0][i];
}
}

if(c[0][i]>=65&&c[0][i]<=90){
for(int q=g;c[1][q]!='\0';q++){
if(c[0][i]==c[1][q])
return c[0][i];
}
}
}
return 0;
}

int  data2(char c[][60]){
for(int k=0;;k++){
if(c[2][k]>=97&&c[2][k]<=122){
for(int f=0;c[3][f]!='\0';f++){
if(c[2][k]==c[3][f]){
return f;
}
}
}
}
return 0;
}


最终正确的代码如下:

#include <stdio.h>

int is_num_char(char c){
if(c >= '0' && c <= '9')
return c - '0';
if(c >= 'A' && c <= 'N'){
return c - 'A' + 10;
}
return -1;
}

int main(){
char sen[4][61];
for(int i = 0; i < 4; i ++){
scanf("%s",&sen[i][0]);
}
int i = 0;
for(; sen[0][i] != '\0' && sen[1][i] != '\0'; i ++){//前两个字符的比较
char c = sen[0][i];
if(sen[0][i] == sen[1][i] && (c >= 'A' && c <= 'G')){
switch(c){
case 'A': printf("MON "); break;
case 'B': printf("TUE "); break;
case 'C': printf("WED "); break;
case 'D': printf("THU "); break;
case 'E': printf("FRI "); break;
case 'F': printf("SAT "); break;
case 'G': printf("SUN "); break;
//case 'A': printf("MON "); break;
}
//printf("DAY %c Now i = %d, j = %d\n",sen[0][i], i, j);
break;
}
//printf("DAY %c Now i = %d, j = %d\n",sen[0][i], i, j);
}
i ++;
int y = i;
//printf("Now i = %d, j = %d\n", i, j);
for(; sen[0][y] != '\0' && sen[1][y] != '\0'; y ++){//前两个字符的比较
if(is_num_char(sen[0][y]) >= 0 && sen[0][y] == sen[1][y]){//A - N 0 - 9
int hour = is_num_char(sen[0][y]);
printf("%d%d:",hour / 10, hour % 10);
//printf("Hour %c %d Now i = %d, y = %d\n",sen[0][i], hour, i, y);
break;
}
}
for(int m = 0; sen[3][m] != '\0' && sen[2][m] != '\0'; m ++){
char c = sen[2][m];
if(sen[2][m] == sen[3][m] && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))){
printf("%d%d",m / 10, m % 10);
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: